mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-11 17:10:13 +00:00
drm fixes for 6.19-rc3
msm:
- GPU:
- Fix crash on a7xx GPUs not supporting IFPC
- Fix perfcntr use with IFPC
- Concurrent binning fix
- DPU:
- Fixed DSC and SSPP fetching issues
- Switched to scnprint instead of snprintf
- Added missing NULL checks in pingpong code
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEEKbZHaGwW9KfbeusDHTzWXnEhr4FAmlPfNYACgkQDHTzWXnE
hr7rXxAAkDrdbevUstxd6nHTy6VnqOhDKEJ3c0Gm5WzVtP52ishoolQqduu/cK1C
IgHIFZmq0Blo24LnwsPg7jOtAcM7TtJ7Mv55fk5gZ8UL+xL2ibSbZbWLK4GsJDPx
fPOJkGgJKWgYy6CnOcxKwrhveDkd/0AJnMujlFfKP8rAIWij9EkdgoLCfYHd7WFo
jYlrAVmNZe3DvE/wGaHOJeCYRoM8GkG/FTcNG7azKldQEXFy3XOk8WlXA5HSp2Js
dh4mEVUNkq3d+wPTKXCqnmXJ/RSh3cVem4g8QiEsoJo1iGIx2fJg1L11dU558l9A
7ofMzKwTQS4+x5ISvJigj0HDv7daJ7xajlE0kE50VVETTEYwMzz4no4S5DF3Ddpb
IQexSaBX/xTUxfWnciCt4P/ppDA9PSwWCqdAKHJ2J5Ml6i8gdttq6A8Da01b4Oe0
mWMsdPbwQRDAuN+ezmbo56Uy1U8Hkll5xrb5bJa2y9Pl7heNXXcztAIemLtY6Cy5
wjSZf4NZWjrzXcR+hZcXRSOxFLaGqE/LJjdrIYmB3mNh74U5EWlsE+UMQntBdaSY
iBiMwUXy9sWG2d6cBomNxFbvTrfezVlPibSHxqb5pTM1qPQbvGG14RsrbBouRtxX
9sovFNW6UC+pEKL1/7pG1BhnxNLeHUrv4NDgUiOGHjpDnEgvvoM=
=HOF4
-----END PGP SIGNATURE-----
Merge tag 'drm-fixes-2025-12-27' of https://gitlab.freedesktop.org/drm/kernel
Pull drm fixes from Dave Airlie:
"Post overeating fixes, only msm for this week has anything, so quiet
as expected.
msm:
- GPU:
- Fix crash on a7xx GPUs not supporting IFPC
- Fix perfcntr use with IFPC
- Concurrent binning fix
- DPU:
- Fixed DSC and SSPP fetching issues
- Switched to scnprint instead of snprintf
- Added missing NULL checks in pingpong code"
* tag 'drm-fixes-2025-12-27' of https://gitlab.freedesktop.org/drm/kernel: (27 commits)
drm/msm: Replace unsafe snprintf usage with scnprintf
drm/msm/dpu: Add missing NULL pointer check for pingpong interface
Revert "drm/msm/dpu: Enable quad-pipe for DSC and dual-DSI case"
Revert "drm/msm/dpu: support plane splitting in quad-pipe case"
drm/msm: msm_iommu.c: fix all kernel-doc warnings
drm/msm: msm_gpu.h: fix all kernel-doc warnings
drm/msm: msm_gem_vma.c: fix all kernel-doc warnings
drm/msm: msm_fence.h: fix all kernel-doc warnings
drm/msm/dpu: dpu_hw_wb.h: fix all kernel-doc warnings
drm/msm/dpu: dpu_hw_vbif.h: fix all kernel-doc warnings
drm/msm/dpu: dpu_hw_top.h: fix all kernel-doc warnings
drm/msm/dpu: dpu_hw_sspp.h: fix all kernel-doc warnings
drm/msm/dpu: dpu_hw_pingpong.h: fix all kernel-doc warnings
drm/msm/dpu: dpu_hw_merge3d.h: fix all kernel-doc warnings
drm/msm/dpu: dpu_hw_lm.h: fix all kernel-doc warnings
drm/msm/dpu: dpu_hw_intf.h: fix all kernel-doc warnings
drm/msm/dpu: dpu_hw_dspp.h: fix all kernel-doc warnings
drm/msm/dpu: dpu_hw_dsc.h: fix all kernel-doc warnings
drm/msm/dpu: dpu_hw_cwb.h: fix all kernel-doc warnings
drm/msm/dpu: dpu_hw_ctl.h: fix all kernel-doc warnings
...
This commit is contained in:
commit
0d362c7fa1
@ -1376,7 +1376,6 @@ static const uint32_t a7xx_pwrup_reglist_regs[] = {
|
||||
REG_A6XX_UCHE_MODE_CNTL,
|
||||
REG_A6XX_RB_NC_MODE_CNTL,
|
||||
REG_A6XX_RB_CMP_DBG_ECO_CNTL,
|
||||
REG_A7XX_GRAS_NC_MODE_CNTL,
|
||||
REG_A6XX_RB_CONTEXT_SWITCH_GMEM_SAVE_RESTORE_ENABLE,
|
||||
REG_A6XX_UCHE_GBIF_GX_CONFIG,
|
||||
REG_A6XX_UCHE_CLIENT_PF,
|
||||
@ -1392,6 +1391,7 @@ static const u32 a750_ifpc_reglist_regs[] = {
|
||||
REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE(2),
|
||||
REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE(3),
|
||||
REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE(4),
|
||||
REG_A6XX_RBBM_PERFCTR_CNTL,
|
||||
REG_A6XX_TPL1_NC_MODE_CNTL,
|
||||
REG_A6XX_SP_NC_MODE_CNTL,
|
||||
REG_A6XX_CP_DBG_ECO_CNTL,
|
||||
@ -1448,6 +1448,12 @@ static const u32 a750_ifpc_reglist_regs[] = {
|
||||
|
||||
DECLARE_ADRENO_REGLIST_LIST(a750_ifpc_reglist);
|
||||
|
||||
static const struct adreno_reglist_pipe a7xx_dyn_pwrup_reglist_regs[] = {
|
||||
{ REG_A7XX_GRAS_NC_MODE_CNTL, 0, BIT(PIPE_BV) | BIT(PIPE_BR) },
|
||||
};
|
||||
|
||||
DECLARE_ADRENO_REGLIST_PIPE_LIST(a7xx_dyn_pwrup_reglist);
|
||||
|
||||
static const struct adreno_info a7xx_gpus[] = {
|
||||
{
|
||||
.chip_ids = ADRENO_CHIP_IDS(0x07000200),
|
||||
@ -1491,6 +1497,7 @@ static const struct adreno_info a7xx_gpus[] = {
|
||||
.hwcg = a730_hwcg,
|
||||
.protect = &a730_protect,
|
||||
.pwrup_reglist = &a7xx_pwrup_reglist,
|
||||
.dyn_pwrup_reglist = &a7xx_dyn_pwrup_reglist,
|
||||
.gbif_cx = a640_gbif,
|
||||
.gmu_cgc_mode = 0x00020000,
|
||||
},
|
||||
@ -1513,6 +1520,7 @@ static const struct adreno_info a7xx_gpus[] = {
|
||||
.hwcg = a740_hwcg,
|
||||
.protect = &a730_protect,
|
||||
.pwrup_reglist = &a7xx_pwrup_reglist,
|
||||
.dyn_pwrup_reglist = &a7xx_dyn_pwrup_reglist,
|
||||
.gbif_cx = a640_gbif,
|
||||
.gmu_chipid = 0x7020100,
|
||||
.gmu_cgc_mode = 0x00020202,
|
||||
@ -1547,6 +1555,7 @@ static const struct adreno_info a7xx_gpus[] = {
|
||||
.hwcg = a740_hwcg,
|
||||
.protect = &a730_protect,
|
||||
.pwrup_reglist = &a7xx_pwrup_reglist,
|
||||
.dyn_pwrup_reglist = &a7xx_dyn_pwrup_reglist,
|
||||
.ifpc_reglist = &a750_ifpc_reglist,
|
||||
.gbif_cx = a640_gbif,
|
||||
.gmu_chipid = 0x7050001,
|
||||
@ -1589,6 +1598,7 @@ static const struct adreno_info a7xx_gpus[] = {
|
||||
.a6xx = &(const struct a6xx_info) {
|
||||
.protect = &a730_protect,
|
||||
.pwrup_reglist = &a7xx_pwrup_reglist,
|
||||
.dyn_pwrup_reglist = &a7xx_dyn_pwrup_reglist,
|
||||
.ifpc_reglist = &a750_ifpc_reglist,
|
||||
.gbif_cx = a640_gbif,
|
||||
.gmu_chipid = 0x7090100,
|
||||
@ -1623,6 +1633,7 @@ static const struct adreno_info a7xx_gpus[] = {
|
||||
.hwcg = a740_hwcg,
|
||||
.protect = &a730_protect,
|
||||
.pwrup_reglist = &a7xx_pwrup_reglist,
|
||||
.dyn_pwrup_reglist = &a7xx_dyn_pwrup_reglist,
|
||||
.gbif_cx = a640_gbif,
|
||||
.gmu_chipid = 0x70f0000,
|
||||
.gmu_cgc_mode = 0x00020222,
|
||||
|
||||
@ -849,9 +849,16 @@ static void a6xx_set_ubwc_config(struct msm_gpu *gpu)
|
||||
min_acc_len_64b << 3 |
|
||||
hbb_lo << 1 | ubwc_mode);
|
||||
|
||||
if (adreno_is_a7xx(adreno_gpu))
|
||||
gpu_write(gpu, REG_A7XX_GRAS_NC_MODE_CNTL,
|
||||
FIELD_PREP(GENMASK(8, 5), hbb_lo));
|
||||
if (adreno_is_a7xx(adreno_gpu)) {
|
||||
for (u32 pipe_id = PIPE_BR; pipe_id <= PIPE_BV; pipe_id++) {
|
||||
gpu_write(gpu, REG_A7XX_CP_APERTURE_CNTL_HOST,
|
||||
A7XX_CP_APERTURE_CNTL_HOST_PIPE(pipe_id));
|
||||
gpu_write(gpu, REG_A7XX_GRAS_NC_MODE_CNTL,
|
||||
FIELD_PREP(GENMASK(8, 5), hbb_lo));
|
||||
}
|
||||
gpu_write(gpu, REG_A7XX_CP_APERTURE_CNTL_HOST,
|
||||
A7XX_CP_APERTURE_CNTL_HOST_PIPE(PIPE_NONE));
|
||||
}
|
||||
|
||||
gpu_write(gpu, REG_A6XX_UCHE_MODE_CNTL,
|
||||
min_acc_len_64b << 23 | hbb_lo << 21);
|
||||
@ -865,23 +872,27 @@ static void a7xx_patch_pwrup_reglist(struct msm_gpu *gpu)
|
||||
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
|
||||
struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
|
||||
const struct adreno_reglist_list *reglist;
|
||||
const struct adreno_reglist_pipe_list *dyn_pwrup_reglist;
|
||||
void *ptr = a6xx_gpu->pwrup_reglist_ptr;
|
||||
struct cpu_gpu_lock *lock = ptr;
|
||||
u32 *dest = (u32 *)&lock->regs[0];
|
||||
u32 dyn_pwrup_reglist_count = 0;
|
||||
int i;
|
||||
|
||||
lock->gpu_req = lock->cpu_req = lock->turn = 0;
|
||||
|
||||
reglist = adreno_gpu->info->a6xx->ifpc_reglist;
|
||||
lock->ifpc_list_len = reglist->count;
|
||||
if (reglist) {
|
||||
lock->ifpc_list_len = reglist->count;
|
||||
|
||||
/*
|
||||
* For each entry in each of the lists, write the offset and the current
|
||||
* register value into the GPU buffer
|
||||
*/
|
||||
for (i = 0; i < reglist->count; i++) {
|
||||
*dest++ = reglist->regs[i];
|
||||
*dest++ = gpu_read(gpu, reglist->regs[i]);
|
||||
/*
|
||||
* For each entry in each of the lists, write the offset and the current
|
||||
* register value into the GPU buffer
|
||||
*/
|
||||
for (i = 0; i < reglist->count; i++) {
|
||||
*dest++ = reglist->regs[i];
|
||||
*dest++ = gpu_read(gpu, reglist->regs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
reglist = adreno_gpu->info->a6xx->pwrup_reglist;
|
||||
@ -907,7 +918,24 @@ static void a7xx_patch_pwrup_reglist(struct msm_gpu *gpu)
|
||||
* (<aperture, shifted 12 bits> <address> <data>), and the length is
|
||||
* stored as number for triplets in dynamic_list_len.
|
||||
*/
|
||||
lock->dynamic_list_len = 0;
|
||||
dyn_pwrup_reglist = adreno_gpu->info->a6xx->dyn_pwrup_reglist;
|
||||
if (dyn_pwrup_reglist) {
|
||||
for (u32 pipe_id = PIPE_BR; pipe_id <= PIPE_BV; pipe_id++) {
|
||||
gpu_write(gpu, REG_A7XX_CP_APERTURE_CNTL_HOST,
|
||||
A7XX_CP_APERTURE_CNTL_HOST_PIPE(pipe_id));
|
||||
for (i = 0; i < dyn_pwrup_reglist->count; i++) {
|
||||
if ((dyn_pwrup_reglist->regs[i].pipe & BIT(pipe_id)) == 0)
|
||||
continue;
|
||||
*dest++ = A7XX_CP_APERTURE_CNTL_HOST_PIPE(pipe_id);
|
||||
*dest++ = dyn_pwrup_reglist->regs[i].offset;
|
||||
*dest++ = gpu_read(gpu, dyn_pwrup_reglist->regs[i].offset);
|
||||
dyn_pwrup_reglist_count++;
|
||||
}
|
||||
}
|
||||
gpu_write(gpu, REG_A7XX_CP_APERTURE_CNTL_HOST,
|
||||
A7XX_CP_APERTURE_CNTL_HOST_PIPE(PIPE_NONE));
|
||||
}
|
||||
lock->dynamic_list_len = dyn_pwrup_reglist_count;
|
||||
}
|
||||
|
||||
static int a7xx_preempt_start(struct msm_gpu *gpu)
|
||||
|
||||
@ -45,6 +45,7 @@ struct a6xx_info {
|
||||
const struct adreno_reglist *hwcg;
|
||||
const struct adreno_protect *protect;
|
||||
const struct adreno_reglist_list *pwrup_reglist;
|
||||
const struct adreno_reglist_pipe_list *dyn_pwrup_reglist;
|
||||
const struct adreno_reglist_list *ifpc_reglist;
|
||||
const struct adreno_reglist *gbif_cx;
|
||||
const struct adreno_reglist_pipe *nonctxt_reglist;
|
||||
|
||||
@ -454,11 +454,11 @@ void a6xx_preempt_init(struct msm_gpu *gpu)
|
||||
gpu->vm, &a6xx_gpu->preempt_postamble_bo,
|
||||
&a6xx_gpu->preempt_postamble_iova);
|
||||
|
||||
preempt_prepare_postamble(a6xx_gpu);
|
||||
|
||||
if (IS_ERR(a6xx_gpu->preempt_postamble_ptr))
|
||||
goto fail;
|
||||
|
||||
preempt_prepare_postamble(a6xx_gpu);
|
||||
|
||||
timer_setup(&a6xx_gpu->preempt_timer, a6xx_preempt_timer, 0);
|
||||
|
||||
return;
|
||||
|
||||
@ -188,6 +188,19 @@ static const struct adreno_reglist_list name = { \
|
||||
.count = ARRAY_SIZE(name ## _regs), \
|
||||
};
|
||||
|
||||
struct adreno_reglist_pipe_list {
|
||||
/** @reg: List of register **/
|
||||
const struct adreno_reglist_pipe *regs;
|
||||
/** @count: Number of registers in the list **/
|
||||
u32 count;
|
||||
};
|
||||
|
||||
#define DECLARE_ADRENO_REGLIST_PIPE_LIST(name) \
|
||||
static const struct adreno_reglist_pipe_list name = { \
|
||||
.regs = name ## _regs, \
|
||||
.count = ARRAY_SIZE(name ## _regs), \
|
||||
};
|
||||
|
||||
struct adreno_gpu {
|
||||
struct msm_gpu base;
|
||||
const struct adreno_info *info;
|
||||
|
||||
@ -200,7 +200,7 @@ static int dpu_crtc_get_lm_crc(struct drm_crtc *crtc,
|
||||
struct dpu_crtc_state *crtc_state)
|
||||
{
|
||||
struct dpu_crtc_mixer *m;
|
||||
u32 crcs[CRTC_QUAD_MIXERS];
|
||||
u32 crcs[CRTC_DUAL_MIXERS];
|
||||
|
||||
int rc = 0;
|
||||
int i;
|
||||
@ -1328,7 +1328,6 @@ static struct msm_display_topology dpu_crtc_get_topology(
|
||||
struct drm_display_mode *mode = &crtc_state->adjusted_mode;
|
||||
struct msm_display_topology topology = {0};
|
||||
struct drm_encoder *drm_enc;
|
||||
u32 num_rt_intf;
|
||||
|
||||
drm_for_each_encoder_mask(drm_enc, crtc->dev, crtc_state->encoder_mask)
|
||||
dpu_encoder_update_topology(drm_enc, &topology, crtc_state->state,
|
||||
@ -1342,14 +1341,11 @@ static struct msm_display_topology dpu_crtc_get_topology(
|
||||
* Dual display
|
||||
* 2 LM, 2 INTF ( Split display using 2 interfaces)
|
||||
*
|
||||
* If DSC is enabled, try to use 4:4:2 topology if there is enough
|
||||
* resource. Otherwise, use 2:2:2 topology.
|
||||
*
|
||||
* Single display
|
||||
* 1 LM, 1 INTF
|
||||
* 2 LM, 1 INTF (stream merge to support high resolution interfaces)
|
||||
*
|
||||
* If DSC is enabled, use 2:2:1 topology
|
||||
* If DSC is enabled, use 2 LMs for 2:2:1 topology
|
||||
*
|
||||
* Add dspps to the reservation requirements if ctm is requested
|
||||
*
|
||||
@ -1361,23 +1357,14 @@ static struct msm_display_topology dpu_crtc_get_topology(
|
||||
* (mode->hdisplay > MAX_HDISPLAY_SPLIT) check.
|
||||
*/
|
||||
|
||||
num_rt_intf = topology.num_intf;
|
||||
if (topology.cwb_enabled)
|
||||
num_rt_intf--;
|
||||
|
||||
if (topology.num_dsc) {
|
||||
if (dpu_kms->catalog->dsc_count >= num_rt_intf * 2)
|
||||
topology.num_dsc = num_rt_intf * 2;
|
||||
else
|
||||
topology.num_dsc = num_rt_intf;
|
||||
topology.num_lm = topology.num_dsc;
|
||||
} else if (num_rt_intf == 2) {
|
||||
if (topology.num_intf == 2 && !topology.cwb_enabled)
|
||||
topology.num_lm = 2;
|
||||
} else if (dpu_kms->catalog->caps->has_3d_merge) {
|
||||
else if (topology.num_dsc == 2)
|
||||
topology.num_lm = 2;
|
||||
else if (dpu_kms->catalog->caps->has_3d_merge)
|
||||
topology.num_lm = (mode->hdisplay > MAX_HDISPLAY_SPLIT) ? 2 : 1;
|
||||
} else {
|
||||
else
|
||||
topology.num_lm = 1;
|
||||
}
|
||||
|
||||
if (crtc_state->ctm)
|
||||
topology.num_dspp = topology.num_lm;
|
||||
@ -1620,17 +1607,6 @@ int dpu_crtc_vblank(struct drm_crtc *crtc, bool en)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* dpu_crtc_get_num_lm - Get mixer number in this CRTC pipeline
|
||||
* @state: Pointer to drm crtc state object
|
||||
*/
|
||||
unsigned int dpu_crtc_get_num_lm(const struct drm_crtc_state *state)
|
||||
{
|
||||
struct dpu_crtc_state *cstate = to_dpu_crtc_state(state);
|
||||
|
||||
return cstate->num_mixers;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static int _dpu_debugfs_status_show(struct seq_file *s, void *data)
|
||||
{
|
||||
|
||||
@ -210,7 +210,7 @@ struct dpu_crtc_state {
|
||||
|
||||
bool bw_control;
|
||||
bool bw_split_vote;
|
||||
struct drm_rect lm_bounds[CRTC_QUAD_MIXERS];
|
||||
struct drm_rect lm_bounds[CRTC_DUAL_MIXERS];
|
||||
|
||||
uint64_t input_fence_timeout_ns;
|
||||
|
||||
@ -218,10 +218,10 @@ struct dpu_crtc_state {
|
||||
|
||||
/* HW Resources reserved for the crtc */
|
||||
u32 num_mixers;
|
||||
struct dpu_crtc_mixer mixers[CRTC_QUAD_MIXERS];
|
||||
struct dpu_crtc_mixer mixers[CRTC_DUAL_MIXERS];
|
||||
|
||||
u32 num_ctls;
|
||||
struct dpu_hw_ctl *hw_ctls[CRTC_QUAD_MIXERS];
|
||||
struct dpu_hw_ctl *hw_ctls[CRTC_DUAL_MIXERS];
|
||||
|
||||
enum dpu_crtc_crc_source crc_source;
|
||||
int crc_frame_skip_count;
|
||||
@ -267,6 +267,4 @@ static inline enum dpu_crtc_client_type dpu_crtc_get_client_type(
|
||||
|
||||
void dpu_crtc_frame_event_cb(struct drm_crtc *crtc, u32 event);
|
||||
|
||||
unsigned int dpu_crtc_get_num_lm(const struct drm_crtc_state *state);
|
||||
|
||||
#endif /* _DPU_CRTC_H_ */
|
||||
|
||||
@ -55,7 +55,7 @@
|
||||
#define MAX_PHYS_ENCODERS_PER_VIRTUAL \
|
||||
(MAX_H_TILES_PER_DISPLAY * NUM_PHYS_ENCODER_TYPES)
|
||||
|
||||
#define MAX_CHANNELS_PER_ENC 4
|
||||
#define MAX_CHANNELS_PER_ENC 2
|
||||
#define MAX_CWB_PER_ENC 2
|
||||
|
||||
#define IDLE_SHORT_TIMEOUT 1
|
||||
@ -661,6 +661,7 @@ void dpu_encoder_update_topology(struct drm_encoder *drm_enc,
|
||||
struct dpu_encoder_virt *dpu_enc = to_dpu_encoder_virt(drm_enc);
|
||||
struct msm_drm_private *priv = dpu_enc->base.dev->dev_private;
|
||||
struct msm_display_info *disp_info = &dpu_enc->disp_info;
|
||||
struct dpu_kms *dpu_kms = to_dpu_kms(priv->kms);
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_state *conn_state;
|
||||
struct drm_framebuffer *fb;
|
||||
@ -674,12 +675,22 @@ void dpu_encoder_update_topology(struct drm_encoder *drm_enc,
|
||||
|
||||
dsc = dpu_encoder_get_dsc_config(drm_enc);
|
||||
|
||||
/*
|
||||
* Set DSC number as 1 to mark the enabled status, will be adjusted
|
||||
* in dpu_crtc_get_topology()
|
||||
*/
|
||||
if (dsc)
|
||||
topology->num_dsc = 1;
|
||||
/* We only support 2 DSC mode (with 2 LM and 1 INTF) */
|
||||
if (dsc) {
|
||||
/*
|
||||
* Use 2 DSC encoders, 2 layer mixers and 1 or 2 interfaces
|
||||
* when Display Stream Compression (DSC) is enabled,
|
||||
* and when enough DSC blocks are available.
|
||||
* This is power-optimal and can drive up to (including) 4k
|
||||
* screens.
|
||||
*/
|
||||
WARN(topology->num_intf > 2,
|
||||
"DSC topology cannot support more than 2 interfaces\n");
|
||||
if (topology->num_intf >= 2 || dpu_kms->catalog->dsc_count >= 2)
|
||||
topology->num_dsc = 2;
|
||||
else
|
||||
topology->num_dsc = 1;
|
||||
}
|
||||
|
||||
connector = drm_atomic_get_new_connector_for_encoder(state, drm_enc);
|
||||
if (!connector)
|
||||
@ -2169,8 +2180,8 @@ static void dpu_encoder_helper_reset_mixers(struct dpu_encoder_phys *phys_enc)
|
||||
{
|
||||
int i, num_lm;
|
||||
struct dpu_global_state *global_state;
|
||||
struct dpu_hw_blk *hw_lm[MAX_CHANNELS_PER_ENC];
|
||||
struct dpu_hw_mixer *hw_mixer[MAX_CHANNELS_PER_ENC];
|
||||
struct dpu_hw_blk *hw_lm[2];
|
||||
struct dpu_hw_mixer *hw_mixer[2];
|
||||
struct dpu_hw_ctl *ctl = phys_enc->hw_ctl;
|
||||
|
||||
/* reset all mixers for this encoder */
|
||||
|
||||
@ -302,7 +302,7 @@ static inline enum dpu_3d_blend_mode dpu_encoder_helper_get_3d_blend_mode(
|
||||
|
||||
/* Use merge_3d unless DSC MERGE topology is used */
|
||||
if (phys_enc->split_role == ENC_ROLE_SOLO &&
|
||||
(dpu_cstate->num_mixers != 1) &&
|
||||
dpu_cstate->num_mixers == CRTC_DUAL_MIXERS &&
|
||||
!dpu_encoder_use_dsc_merge(phys_enc->parent))
|
||||
return BLEND_3D_H_ROW_INT;
|
||||
|
||||
|
||||
@ -247,14 +247,12 @@ static void dpu_encoder_phys_wb_setup_ctl(struct dpu_encoder_phys *phys_enc)
|
||||
if (hw_cdm)
|
||||
intf_cfg.cdm = hw_cdm->idx;
|
||||
|
||||
if (phys_enc->hw_pp->merge_3d && phys_enc->hw_pp->merge_3d->ops.setup_3d_mode)
|
||||
phys_enc->hw_pp->merge_3d->ops.setup_3d_mode(phys_enc->hw_pp->merge_3d,
|
||||
mode_3d);
|
||||
if (hw_pp && hw_pp->merge_3d && hw_pp->merge_3d->ops.setup_3d_mode)
|
||||
hw_pp->merge_3d->ops.setup_3d_mode(hw_pp->merge_3d, mode_3d);
|
||||
|
||||
/* setup which pp blk will connect to this wb */
|
||||
if (hw_pp && phys_enc->hw_wb->ops.bind_pingpong_blk)
|
||||
phys_enc->hw_wb->ops.bind_pingpong_blk(phys_enc->hw_wb,
|
||||
phys_enc->hw_pp->idx);
|
||||
if (hw_pp && hw_wb->ops.bind_pingpong_blk)
|
||||
hw_wb->ops.bind_pingpong_blk(hw_wb, hw_pp->idx);
|
||||
|
||||
phys_enc->hw_ctl->ops.setup_intf_cfg(phys_enc->hw_ctl, &intf_cfg);
|
||||
} else if (phys_enc->hw_ctl && phys_enc->hw_ctl->ops.setup_intf_cfg) {
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
#define DPU_MAX_IMG_WIDTH 0x3fff
|
||||
#define DPU_MAX_IMG_HEIGHT 0x3fff
|
||||
|
||||
#define CRTC_QUAD_MIXERS 4
|
||||
#define CRTC_DUAL_MIXERS 2
|
||||
|
||||
#define MAX_XIN_COUNT 16
|
||||
|
||||
|
||||
@ -89,13 +89,13 @@ enum dpu_hw_cdwn_op_mode_method_h_v {
|
||||
*/
|
||||
struct dpu_hw_cdm_ops {
|
||||
/**
|
||||
* Enable the CDM module
|
||||
* @enable: Enable the CDM module
|
||||
* @cdm Pointer to chroma down context
|
||||
*/
|
||||
int (*enable)(struct dpu_hw_cdm *cdm, struct dpu_hw_cdm_cfg *cfg);
|
||||
|
||||
/**
|
||||
* Enable/disable the connection with pingpong
|
||||
* @bind_pingpong_blk: Enable/disable the connection with pingpong
|
||||
* @cdm Pointer to chroma down context
|
||||
* @pp pingpong block id.
|
||||
*/
|
||||
|
||||
@ -12,9 +12,9 @@
|
||||
#include "dpu_hw_sspp.h"
|
||||
|
||||
/**
|
||||
* dpu_ctl_mode_sel: Interface mode selection
|
||||
* DPU_CTL_MODE_SEL_VID: Video mode interface
|
||||
* DPU_CTL_MODE_SEL_CMD: Command mode interface
|
||||
* enum dpu_ctl_mode_sel: Interface mode selection
|
||||
* @DPU_CTL_MODE_SEL_VID: Video mode interface
|
||||
* @DPU_CTL_MODE_SEL_CMD: Command mode interface
|
||||
*/
|
||||
enum dpu_ctl_mode_sel {
|
||||
DPU_CTL_MODE_SEL_VID = 0,
|
||||
@ -37,6 +37,7 @@ struct dpu_hw_stage_cfg {
|
||||
* struct dpu_hw_intf_cfg :Describes how the DPU writes data to output interface
|
||||
* @intf : Interface id
|
||||
* @intf_master: Master interface id in the dual pipe topology
|
||||
* @wb: Writeback mode
|
||||
* @mode_3d: 3d mux configuration
|
||||
* @merge_3d: 3d merge block used
|
||||
* @intf_mode_sel: Interface mode, cmd / vid
|
||||
@ -64,21 +65,21 @@ struct dpu_hw_intf_cfg {
|
||||
*/
|
||||
struct dpu_hw_ctl_ops {
|
||||
/**
|
||||
* kickoff hw operation for Sw controlled interfaces
|
||||
* @trigger_start: kickoff hw operation for Sw controlled interfaces
|
||||
* DSI cmd mode and WB interface are SW controlled
|
||||
* @ctx : ctl path ctx pointer
|
||||
*/
|
||||
void (*trigger_start)(struct dpu_hw_ctl *ctx);
|
||||
|
||||
/**
|
||||
* check if the ctl is started
|
||||
* @is_started: check if the ctl is started
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @Return: true if started, false if stopped
|
||||
*/
|
||||
bool (*is_started)(struct dpu_hw_ctl *ctx);
|
||||
|
||||
/**
|
||||
* kickoff prepare is in progress hw operation for sw
|
||||
* @trigger_pending: kickoff prepare is in progress hw operation for sw
|
||||
* controlled interfaces: DSI cmd mode and WB interface
|
||||
* are SW controlled
|
||||
* @ctx : ctl path ctx pointer
|
||||
@ -86,7 +87,7 @@ struct dpu_hw_ctl_ops {
|
||||
void (*trigger_pending)(struct dpu_hw_ctl *ctx);
|
||||
|
||||
/**
|
||||
* Clear the value of the cached pending_flush_mask
|
||||
* @clear_pending_flush: Clear the value of the cached pending_flush_mask
|
||||
* No effect on hardware.
|
||||
* Required to be implemented.
|
||||
* @ctx : ctl path ctx pointer
|
||||
@ -94,14 +95,15 @@ struct dpu_hw_ctl_ops {
|
||||
void (*clear_pending_flush)(struct dpu_hw_ctl *ctx);
|
||||
|
||||
/**
|
||||
* Query the value of the cached pending_flush_mask
|
||||
* @get_pending_flush: Query the value of the cached pending_flush_mask
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
*/
|
||||
u32 (*get_pending_flush)(struct dpu_hw_ctl *ctx);
|
||||
|
||||
/**
|
||||
* OR in the given flushbits to the cached pending_flush_mask
|
||||
* @update_pending_flush: OR in the given flushbits to the cached
|
||||
* pending_flush_mask.
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @flushbits : module flushmask
|
||||
@ -110,7 +112,8 @@ struct dpu_hw_ctl_ops {
|
||||
u32 flushbits);
|
||||
|
||||
/**
|
||||
* OR in the given flushbits to the cached pending_(wb_)flush_mask
|
||||
* @update_pending_flush_wb: OR in the given flushbits to the
|
||||
* cached pending_(wb_)flush_mask.
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @blk : writeback block index
|
||||
@ -119,7 +122,8 @@ struct dpu_hw_ctl_ops {
|
||||
enum dpu_wb blk);
|
||||
|
||||
/**
|
||||
* OR in the given flushbits to the cached pending_(cwb_)flush_mask
|
||||
* @update_pending_flush_cwb: OR in the given flushbits to the
|
||||
* cached pending_(cwb_)flush_mask.
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @blk : concurrent writeback block index
|
||||
@ -128,7 +132,8 @@ struct dpu_hw_ctl_ops {
|
||||
enum dpu_cwb blk);
|
||||
|
||||
/**
|
||||
* OR in the given flushbits to the cached pending_(intf_)flush_mask
|
||||
* @update_pending_flush_intf: OR in the given flushbits to the
|
||||
* cached pending_(intf_)flush_mask.
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @blk : interface block index
|
||||
@ -137,7 +142,8 @@ struct dpu_hw_ctl_ops {
|
||||
enum dpu_intf blk);
|
||||
|
||||
/**
|
||||
* OR in the given flushbits to the cached pending_(periph_)flush_mask
|
||||
* @update_pending_flush_periph: OR in the given flushbits to the
|
||||
* cached pending_(periph_)flush_mask.
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @blk : interface block index
|
||||
@ -146,7 +152,8 @@ struct dpu_hw_ctl_ops {
|
||||
enum dpu_intf blk);
|
||||
|
||||
/**
|
||||
* OR in the given flushbits to the cached pending_(merge_3d_)flush_mask
|
||||
* @update_pending_flush_merge_3d: OR in the given flushbits to the
|
||||
* cached pending_(merge_3d_)flush_mask.
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @blk : interface block index
|
||||
@ -155,7 +162,8 @@ struct dpu_hw_ctl_ops {
|
||||
enum dpu_merge_3d blk);
|
||||
|
||||
/**
|
||||
* OR in the given flushbits to the cached pending_flush_mask
|
||||
* @update_pending_flush_sspp: OR in the given flushbits to the
|
||||
* cached pending_flush_mask.
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @blk : SSPP block index
|
||||
@ -164,7 +172,8 @@ struct dpu_hw_ctl_ops {
|
||||
enum dpu_sspp blk);
|
||||
|
||||
/**
|
||||
* OR in the given flushbits to the cached pending_flush_mask
|
||||
* @update_pending_flush_mixer: OR in the given flushbits to the
|
||||
* cached pending_flush_mask.
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @blk : LM block index
|
||||
@ -173,7 +182,8 @@ struct dpu_hw_ctl_ops {
|
||||
enum dpu_lm blk);
|
||||
|
||||
/**
|
||||
* OR in the given flushbits to the cached pending_flush_mask
|
||||
* @update_pending_flush_dspp: OR in the given flushbits to the
|
||||
* cached pending_flush_mask.
|
||||
* No effect on hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @blk : DSPP block index
|
||||
@ -183,7 +193,8 @@ struct dpu_hw_ctl_ops {
|
||||
enum dpu_dspp blk, u32 dspp_sub_blk);
|
||||
|
||||
/**
|
||||
* OR in the given flushbits to the cached pending_(dsc_)flush_mask
|
||||
* @update_pending_flush_dsc: OR in the given flushbits to the
|
||||
* cached pending_(dsc_)flush_mask.
|
||||
* No effect on hardware
|
||||
* @ctx: ctl path ctx pointer
|
||||
* @blk: interface block index
|
||||
@ -192,7 +203,8 @@ struct dpu_hw_ctl_ops {
|
||||
enum dpu_dsc blk);
|
||||
|
||||
/**
|
||||
* OR in the given flushbits to the cached pending_(cdm_)flush_mask
|
||||
* @update_pending_flush_cdm: OR in the given flushbits to the
|
||||
* cached pending_(cdm_)flush_mask.
|
||||
* No effect on hardware
|
||||
* @ctx: ctl path ctx pointer
|
||||
* @cdm_num: idx of cdm to be flushed
|
||||
@ -200,20 +212,20 @@ struct dpu_hw_ctl_ops {
|
||||
void (*update_pending_flush_cdm)(struct dpu_hw_ctl *ctx, enum dpu_cdm cdm_num);
|
||||
|
||||
/**
|
||||
* Write the value of the pending_flush_mask to hardware
|
||||
* @trigger_flush: Write the value of the pending_flush_mask to hardware
|
||||
* @ctx : ctl path ctx pointer
|
||||
*/
|
||||
void (*trigger_flush)(struct dpu_hw_ctl *ctx);
|
||||
|
||||
/**
|
||||
* Read the value of the flush register
|
||||
* @get_flush_register: Read the value of the flush register
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @Return: value of the ctl flush register.
|
||||
*/
|
||||
u32 (*get_flush_register)(struct dpu_hw_ctl *ctx);
|
||||
|
||||
/**
|
||||
* Setup ctl_path interface config
|
||||
* @setup_intf_cfg: Setup ctl_path interface config
|
||||
* @ctx
|
||||
* @cfg : interface config structure pointer
|
||||
*/
|
||||
@ -221,17 +233,20 @@ struct dpu_hw_ctl_ops {
|
||||
struct dpu_hw_intf_cfg *cfg);
|
||||
|
||||
/**
|
||||
* reset ctl_path interface config
|
||||
* @reset_intf_cfg: reset ctl_path interface config
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @cfg : interface config structure pointer
|
||||
*/
|
||||
void (*reset_intf_cfg)(struct dpu_hw_ctl *ctx,
|
||||
struct dpu_hw_intf_cfg *cfg);
|
||||
|
||||
/**
|
||||
* @reset: reset function for this ctl type
|
||||
*/
|
||||
int (*reset)(struct dpu_hw_ctl *c);
|
||||
|
||||
/*
|
||||
* wait_reset_status - checks ctl reset status
|
||||
/**
|
||||
* @wait_reset_status: checks ctl reset status
|
||||
* @ctx : ctl path ctx pointer
|
||||
*
|
||||
* This function checks the ctl reset status bit.
|
||||
@ -242,13 +257,13 @@ struct dpu_hw_ctl_ops {
|
||||
int (*wait_reset_status)(struct dpu_hw_ctl *ctx);
|
||||
|
||||
/**
|
||||
* Set all blend stages to disabled
|
||||
* @clear_all_blendstages: Set all blend stages to disabled
|
||||
* @ctx : ctl path ctx pointer
|
||||
*/
|
||||
void (*clear_all_blendstages)(struct dpu_hw_ctl *ctx);
|
||||
|
||||
/**
|
||||
* Configure layer mixer to pipe configuration
|
||||
* @setup_blendstage: Configure layer mixer to pipe configuration
|
||||
* @ctx : ctl path ctx pointer
|
||||
* @lm : layer mixer enumeration
|
||||
* @cfg : blend stage configuration
|
||||
@ -256,11 +271,16 @@ struct dpu_hw_ctl_ops {
|
||||
void (*setup_blendstage)(struct dpu_hw_ctl *ctx,
|
||||
enum dpu_lm lm, struct dpu_hw_stage_cfg *cfg);
|
||||
|
||||
/**
|
||||
* @set_active_fetch_pipes: Set active pipes attached to this CTL
|
||||
* @ctx: ctl path ctx pointer
|
||||
* @active_pipes: bitmap of enum dpu_sspp
|
||||
*/
|
||||
void (*set_active_fetch_pipes)(struct dpu_hw_ctl *ctx,
|
||||
unsigned long *fetch_active);
|
||||
|
||||
/**
|
||||
* Set active pipes attached to this CTL
|
||||
* @set_active_pipes: Set active pipes attached to this CTL
|
||||
* @ctx: ctl path ctx pointer
|
||||
* @active_pipes: bitmap of enum dpu_sspp
|
||||
*/
|
||||
@ -268,13 +288,12 @@ struct dpu_hw_ctl_ops {
|
||||
unsigned long *active_pipes);
|
||||
|
||||
/**
|
||||
* Set active layer mixers attached to this CTL
|
||||
* @set_active_lms: Set active layer mixers attached to this CTL
|
||||
* @ctx: ctl path ctx pointer
|
||||
* @active_lms: bitmap of enum dpu_lm
|
||||
*/
|
||||
void (*set_active_lms)(struct dpu_hw_ctl *ctx,
|
||||
unsigned long *active_lms);
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
@ -289,6 +308,9 @@ struct dpu_hw_ctl_ops {
|
||||
* @pending_intf_flush_mask: pending INTF flush
|
||||
* @pending_wb_flush_mask: pending WB flush
|
||||
* @pending_cwb_flush_mask: pending CWB flush
|
||||
* @pending_periph_flush_mask: pending PERIPH flush
|
||||
* @pending_merge_3d_flush_mask: pending MERGE 3D flush
|
||||
* @pending_dspp_flush_mask: pending DSPP flush
|
||||
* @pending_dsc_flush_mask: pending DSC flush
|
||||
* @pending_cdm_flush_mask: pending CDM flush
|
||||
* @mdss_ver: MDSS revision information
|
||||
@ -320,7 +342,7 @@ struct dpu_hw_ctl {
|
||||
};
|
||||
|
||||
/**
|
||||
* dpu_hw_ctl - convert base object dpu_hw_base to container
|
||||
* to_dpu_hw_ctl - convert base object dpu_hw_base to container
|
||||
* @hw: Pointer to base hardware block
|
||||
* return: Pointer to hardware block container
|
||||
*/
|
||||
|
||||
@ -28,7 +28,6 @@ struct dpu_hw_cwb_setup_cfg {
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* struct dpu_hw_cwb_ops : Interface to the cwb hw driver functions
|
||||
* @config_cwb: configure CWB mux
|
||||
*/
|
||||
@ -54,7 +53,7 @@ struct dpu_hw_cwb {
|
||||
};
|
||||
|
||||
/**
|
||||
* dpu_hw_cwb - convert base object dpu_hw_base to container
|
||||
* to_dpu_hw_cwb - convert base object dpu_hw_base to container
|
||||
* @hw: Pointer to base hardware block
|
||||
* return: Pointer to hardware block container
|
||||
*/
|
||||
|
||||
@ -21,13 +21,13 @@ struct dpu_hw_dsc;
|
||||
*/
|
||||
struct dpu_hw_dsc_ops {
|
||||
/**
|
||||
* dsc_disable - disable dsc
|
||||
* @dsc_disable: disable dsc
|
||||
* @hw_dsc: Pointer to dsc context
|
||||
*/
|
||||
void (*dsc_disable)(struct dpu_hw_dsc *hw_dsc);
|
||||
|
||||
/**
|
||||
* dsc_config - configures dsc encoder
|
||||
* @dsc_config: configures dsc encoder
|
||||
* @hw_dsc: Pointer to dsc context
|
||||
* @dsc: panel dsc parameters
|
||||
* @mode: dsc topology mode to be set
|
||||
@ -39,13 +39,17 @@ struct dpu_hw_dsc_ops {
|
||||
u32 initial_lines);
|
||||
|
||||
/**
|
||||
* dsc_config_thresh - programs panel thresholds
|
||||
* @dsc_config_thresh: programs panel thresholds
|
||||
* @hw_dsc: Pointer to dsc context
|
||||
* @dsc: panel dsc parameters
|
||||
*/
|
||||
void (*dsc_config_thresh)(struct dpu_hw_dsc *hw_dsc,
|
||||
struct drm_dsc_config *dsc);
|
||||
|
||||
/**
|
||||
* @dsc_bind_pingpong_blk: binds pixel output from a DSC block
|
||||
* to a pingpong block
|
||||
*/
|
||||
void (*dsc_bind_pingpong_blk)(struct dpu_hw_dsc *hw_dsc,
|
||||
enum dpu_pingpong pp);
|
||||
};
|
||||
|
||||
@ -22,7 +22,7 @@ struct dpu_hw_pcc_coeff {
|
||||
};
|
||||
|
||||
/**
|
||||
* struct dpu_hw_pcc - pcc feature structure
|
||||
* struct dpu_hw_pcc_cfg - pcc feature structure
|
||||
* @r: red coefficients.
|
||||
* @g: green coefficients.
|
||||
* @b: blue coefficients.
|
||||
@ -40,7 +40,7 @@ struct dpu_hw_pcc_cfg {
|
||||
*/
|
||||
struct dpu_hw_dspp_ops {
|
||||
/**
|
||||
* setup_pcc - setup dspp pcc
|
||||
* @setup_pcc: setup_pcc - setup dspp pcc
|
||||
* @ctx: Pointer to dspp context
|
||||
* @cfg: Pointer to configuration
|
||||
*/
|
||||
@ -69,7 +69,7 @@ struct dpu_hw_dspp {
|
||||
};
|
||||
|
||||
/**
|
||||
* dpu_hw_dspp - convert base object dpu_hw_base to container
|
||||
* to_dpu_hw_dspp - convert base object dpu_hw_base to container
|
||||
* @hw: Pointer to base hardware block
|
||||
* return: Pointer to hardware block container
|
||||
*/
|
||||
|
||||
@ -57,11 +57,11 @@ struct dpu_hw_intf_cmd_mode_cfg {
|
||||
/**
|
||||
* struct dpu_hw_intf_ops : Interface to the interface Hw driver functions
|
||||
* Assumption is these functions will be called after clocks are enabled
|
||||
* @ setup_timing_gen : programs the timing engine
|
||||
* @ setup_prog_fetch : enables/disables the programmable fetch logic
|
||||
* @ enable_timing: enable/disable timing engine
|
||||
* @ get_status: returns if timing engine is enabled or not
|
||||
* @ get_line_count: reads current vertical line counter
|
||||
* @setup_timing_gen : programs the timing engine
|
||||
* @setup_prg_fetch : enables/disables the programmable fetch logic
|
||||
* @enable_timing: enable/disable timing engine
|
||||
* @get_status: returns if timing engine is enabled or not
|
||||
* @get_line_count: reads current vertical line counter
|
||||
* @bind_pingpong_blk: enable/disable the connection with pingpong which will
|
||||
* feed pixels to this interface
|
||||
* @setup_misr: enable/disable MISR
|
||||
@ -70,12 +70,9 @@ struct dpu_hw_intf_cmd_mode_cfg {
|
||||
* pointer and programs the tear check configuration
|
||||
* @disable_tearcheck: Disables tearcheck block
|
||||
* @connect_external_te: Read, modify, write to either set or clear listening to external TE
|
||||
* Return: 1 if TE was originally connected, 0 if not, or -ERROR
|
||||
* @get_vsync_info: Provides the programmed and current line_count
|
||||
* @setup_autorefresh: Configure and enable the autorefresh config
|
||||
* @get_autorefresh: Retrieve autorefresh config from hardware
|
||||
* Return: 0 on success, -ETIMEDOUT on timeout
|
||||
* Returns 1 if TE was originally connected, 0 if not, or -ERROR
|
||||
* @vsync_sel: Select vsync signal for tear-effect configuration
|
||||
* @disable_autorefresh: Disable autorefresh if enabled
|
||||
* @program_intf_cmd_cfg: Program the DPU to interface datapath for command mode
|
||||
*/
|
||||
struct dpu_hw_intf_ops {
|
||||
@ -109,9 +106,6 @@ struct dpu_hw_intf_ops {
|
||||
|
||||
void (*vsync_sel)(struct dpu_hw_intf *intf, enum dpu_vsync_source vsync_source);
|
||||
|
||||
/**
|
||||
* Disable autorefresh if enabled
|
||||
*/
|
||||
void (*disable_autorefresh)(struct dpu_hw_intf *intf, uint32_t encoder_id, u16 vdisplay);
|
||||
|
||||
void (*program_intf_cmd_cfg)(struct dpu_hw_intf *intf,
|
||||
|
||||
@ -25,39 +25,38 @@ struct dpu_hw_color3_cfg {
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* struct dpu_hw_lm_ops : Interface to the mixer Hw driver functions
|
||||
* Assumption is these functions will be called after clocks are enabled
|
||||
*/
|
||||
struct dpu_hw_lm_ops {
|
||||
/*
|
||||
* Sets up mixer output width and height
|
||||
/**
|
||||
* @setup_mixer_out: Sets up mixer output width and height
|
||||
* and border color if enabled
|
||||
*/
|
||||
void (*setup_mixer_out)(struct dpu_hw_mixer *ctx,
|
||||
struct dpu_hw_mixer_cfg *cfg);
|
||||
|
||||
/*
|
||||
* Alpha blending configuration
|
||||
/**
|
||||
* @setup_blend_config: Alpha blending configuration
|
||||
* for the specified stage
|
||||
*/
|
||||
void (*setup_blend_config)(struct dpu_hw_mixer *ctx, uint32_t stage,
|
||||
uint32_t fg_alpha, uint32_t bg_alpha, uint32_t blend_op);
|
||||
|
||||
/*
|
||||
* Alpha color component selection from either fg or bg
|
||||
/**
|
||||
* @setup_alpha_out: Alpha color component selection from either fg or bg
|
||||
*/
|
||||
void (*setup_alpha_out)(struct dpu_hw_mixer *ctx, uint32_t mixer_op);
|
||||
|
||||
/**
|
||||
* Clear layer mixer to pipe configuration
|
||||
* @clear_all_blendstages: Clear layer mixer to pipe configuration
|
||||
* @ctx : mixer ctx pointer
|
||||
* Returns: 0 on success or -error
|
||||
*/
|
||||
int (*clear_all_blendstages)(struct dpu_hw_mixer *ctx);
|
||||
|
||||
/**
|
||||
* Configure layer mixer to pipe configuration
|
||||
* @setup_blendstage: Configure layer mixer to pipe configuration
|
||||
* @ctx : mixer ctx pointer
|
||||
* @lm : layer mixer enumeration
|
||||
* @stage_cfg : blend stage configuration
|
||||
@ -67,19 +66,19 @@ struct dpu_hw_lm_ops {
|
||||
struct dpu_hw_stage_cfg *stage_cfg);
|
||||
|
||||
/**
|
||||
* setup_border_color : enable/disable border color
|
||||
* @setup_border_color : enable/disable border color
|
||||
*/
|
||||
void (*setup_border_color)(struct dpu_hw_mixer *ctx,
|
||||
struct dpu_mdss_color *color,
|
||||
u8 border_en);
|
||||
|
||||
/**
|
||||
* setup_misr: Enable/disable MISR
|
||||
* @setup_misr: Enable/disable MISR
|
||||
*/
|
||||
void (*setup_misr)(struct dpu_hw_mixer *ctx);
|
||||
|
||||
/**
|
||||
* collect_misr: Read MISR signature
|
||||
* @collect_misr: Read MISR signature
|
||||
*/
|
||||
int (*collect_misr)(struct dpu_hw_mixer *ctx, u32 *misr_value);
|
||||
};
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
#define DPU_MAX_PLANES 4
|
||||
#endif
|
||||
|
||||
#define STAGES_PER_PLANE 2
|
||||
#define STAGES_PER_PLANE 1
|
||||
#define PIPES_PER_STAGE 2
|
||||
#define PIPES_PER_PLANE (PIPES_PER_STAGE * STAGES_PER_PLANE)
|
||||
#ifndef DPU_MAX_DE_CURVES
|
||||
|
||||
@ -12,7 +12,6 @@
|
||||
struct dpu_hw_merge_3d;
|
||||
|
||||
/**
|
||||
*
|
||||
* struct dpu_hw_merge_3d_ops : Interface to the merge_3d Hw driver functions
|
||||
* Assumption is these functions will be called after clocks are enabled
|
||||
* @setup_3d_mode : enable 3D merge
|
||||
|
||||
@ -34,7 +34,6 @@ struct dpu_hw_dither_cfg {
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* struct dpu_hw_pingpong_ops : Interface to the pingpong Hw driver functions
|
||||
* Assumption is these functions will be called after clocks are enabled
|
||||
* @enable_tearcheck: program and enable tear check block
|
||||
@ -44,51 +43,52 @@ struct dpu_hw_dither_cfg {
|
||||
*/
|
||||
struct dpu_hw_pingpong_ops {
|
||||
/**
|
||||
* enables vysnc generation and sets up init value of
|
||||
* @enable_tearcheck: enables vysnc generation and sets up init value of
|
||||
* read pointer and programs the tear check cofiguration
|
||||
*/
|
||||
int (*enable_tearcheck)(struct dpu_hw_pingpong *pp,
|
||||
struct dpu_hw_tear_check *cfg);
|
||||
|
||||
/**
|
||||
* disables tear check block
|
||||
* @disable_tearcheck: disables tear check block
|
||||
*/
|
||||
int (*disable_tearcheck)(struct dpu_hw_pingpong *pp);
|
||||
|
||||
/**
|
||||
* read, modify, write to either set or clear listening to external TE
|
||||
* @connect_external_te: read, modify, write to either set or clear
|
||||
* listening to external TE
|
||||
* @Return: 1 if TE was originally connected, 0 if not, or -ERROR
|
||||
*/
|
||||
int (*connect_external_te)(struct dpu_hw_pingpong *pp,
|
||||
bool enable_external_te);
|
||||
|
||||
/**
|
||||
* Obtain current vertical line counter
|
||||
* @get_line_count: Obtain current vertical line counter
|
||||
*/
|
||||
u32 (*get_line_count)(struct dpu_hw_pingpong *pp);
|
||||
|
||||
/**
|
||||
* Disable autorefresh if enabled
|
||||
* @disable_autorefresh: Disable autorefresh if enabled
|
||||
*/
|
||||
void (*disable_autorefresh)(struct dpu_hw_pingpong *pp, uint32_t encoder_id, u16 vdisplay);
|
||||
|
||||
/**
|
||||
* Setup dither matix for pingpong block
|
||||
* @setup_dither: Setup dither matix for pingpong block
|
||||
*/
|
||||
void (*setup_dither)(struct dpu_hw_pingpong *pp,
|
||||
struct dpu_hw_dither_cfg *cfg);
|
||||
/**
|
||||
* Enable DSC
|
||||
* @enable_dsc: Enable DSC
|
||||
*/
|
||||
int (*enable_dsc)(struct dpu_hw_pingpong *pp);
|
||||
|
||||
/**
|
||||
* Disable DSC
|
||||
* @disable_dsc: Disable DSC
|
||||
*/
|
||||
void (*disable_dsc)(struct dpu_hw_pingpong *pp);
|
||||
|
||||
/**
|
||||
* Setup DSC
|
||||
* @setup_dsc: Setup DSC
|
||||
*/
|
||||
int (*setup_dsc)(struct dpu_hw_pingpong *pp);
|
||||
};
|
||||
|
||||
@ -14,7 +14,7 @@ struct dpu_hw_sspp;
|
||||
|
||||
#define DPU_SSPP_MAX_PITCH_SIZE 0xffff
|
||||
|
||||
/**
|
||||
/*
|
||||
* Flags
|
||||
*/
|
||||
#define DPU_SSPP_FLIP_LR BIT(0)
|
||||
@ -23,7 +23,7 @@ struct dpu_hw_sspp;
|
||||
#define DPU_SSPP_ROT_90 BIT(3)
|
||||
#define DPU_SSPP_SOLID_FILL BIT(4)
|
||||
|
||||
/**
|
||||
/*
|
||||
* Component indices
|
||||
*/
|
||||
enum {
|
||||
@ -36,9 +36,10 @@ enum {
|
||||
};
|
||||
|
||||
/**
|
||||
* DPU_SSPP_RECT_SOLO - multirect disabled
|
||||
* DPU_SSPP_RECT_0 - rect0 of a multirect pipe
|
||||
* DPU_SSPP_RECT_1 - rect1 of a multirect pipe
|
||||
* enum dpu_sspp_multirect_index - multirect mode
|
||||
* @DPU_SSPP_RECT_SOLO: multirect disabled
|
||||
* @DPU_SSPP_RECT_0: rect0 of a multirect pipe
|
||||
* @DPU_SSPP_RECT_1: rect1 of a multirect pipe
|
||||
*
|
||||
* Note: HW supports multirect with either RECT0 or
|
||||
* RECT1. Considering no benefit of such configs over
|
||||
@ -143,7 +144,7 @@ struct dpu_hw_pixel_ext {
|
||||
* struct dpu_sw_pipe_cfg : software pipe configuration
|
||||
* @src_rect: src ROI, caller takes into account the different operations
|
||||
* such as decimation, flip etc to program this field
|
||||
* @dest_rect: destination ROI.
|
||||
* @dst_rect: destination ROI.
|
||||
* @rotation: simplified drm rotation hint
|
||||
*/
|
||||
struct dpu_sw_pipe_cfg {
|
||||
@ -165,8 +166,8 @@ struct dpu_hw_pipe_ts_cfg {
|
||||
/**
|
||||
* struct dpu_sw_pipe - software pipe description
|
||||
* @sspp: backing SSPP pipe
|
||||
* @index: index of the rectangle of SSPP
|
||||
* @mode: parallel or time multiplex multirect mode
|
||||
* @multirect_index: index of the rectangle of SSPP
|
||||
* @multirect_mode: parallel or time multiplex multirect mode
|
||||
*/
|
||||
struct dpu_sw_pipe {
|
||||
struct dpu_hw_sspp *sspp;
|
||||
@ -181,7 +182,7 @@ struct dpu_sw_pipe {
|
||||
*/
|
||||
struct dpu_hw_sspp_ops {
|
||||
/**
|
||||
* setup_format - setup pixel format cropping rectangle, flip
|
||||
* @setup_format: setup pixel format cropping rectangle, flip
|
||||
* @pipe: Pointer to software pipe context
|
||||
* @cfg: Pointer to pipe config structure
|
||||
* @flags: Extra flags for format config
|
||||
@ -190,7 +191,7 @@ struct dpu_hw_sspp_ops {
|
||||
const struct msm_format *fmt, u32 flags);
|
||||
|
||||
/**
|
||||
* setup_rects - setup pipe ROI rectangles
|
||||
* @setup_rects: setup pipe ROI rectangles
|
||||
* @pipe: Pointer to software pipe context
|
||||
* @cfg: Pointer to pipe config structure
|
||||
*/
|
||||
@ -198,7 +199,7 @@ struct dpu_hw_sspp_ops {
|
||||
struct dpu_sw_pipe_cfg *cfg);
|
||||
|
||||
/**
|
||||
* setup_pe - setup pipe pixel extension
|
||||
* @setup_pe: setup pipe pixel extension
|
||||
* @ctx: Pointer to pipe context
|
||||
* @pe_ext: Pointer to pixel ext settings
|
||||
*/
|
||||
@ -206,7 +207,7 @@ struct dpu_hw_sspp_ops {
|
||||
struct dpu_hw_pixel_ext *pe_ext);
|
||||
|
||||
/**
|
||||
* setup_sourceaddress - setup pipe source addresses
|
||||
* @setup_sourceaddress: setup pipe source addresses
|
||||
* @pipe: Pointer to software pipe context
|
||||
* @layout: format layout information for programming buffer to hardware
|
||||
*/
|
||||
@ -214,14 +215,14 @@ struct dpu_hw_sspp_ops {
|
||||
struct dpu_hw_fmt_layout *layout);
|
||||
|
||||
/**
|
||||
* setup_csc - setup color space coversion
|
||||
* @setup_csc: setup color space coversion
|
||||
* @ctx: Pointer to pipe context
|
||||
* @data: Pointer to config structure
|
||||
*/
|
||||
void (*setup_csc)(struct dpu_hw_sspp *ctx, const struct dpu_csc_cfg *data);
|
||||
|
||||
/**
|
||||
* setup_solidfill - enable/disable colorfill
|
||||
* @setup_solidfill: enable/disable colorfill
|
||||
* @pipe: Pointer to software pipe context
|
||||
* @const_color: Fill color value
|
||||
* @flags: Pipe flags
|
||||
@ -229,23 +230,22 @@ struct dpu_hw_sspp_ops {
|
||||
void (*setup_solidfill)(struct dpu_sw_pipe *pipe, u32 color);
|
||||
|
||||
/**
|
||||
* setup_multirect - setup multirect configuration
|
||||
* @setup_multirect: setup multirect configuration
|
||||
* @pipe: Pointer to software pipe context
|
||||
*/
|
||||
|
||||
void (*setup_multirect)(struct dpu_sw_pipe *pipe);
|
||||
|
||||
/**
|
||||
* setup_sharpening - setup sharpening
|
||||
* @setup_sharpening: setup sharpening
|
||||
* @ctx: Pointer to pipe context
|
||||
* @cfg: Pointer to config structure
|
||||
*/
|
||||
void (*setup_sharpening)(struct dpu_hw_sspp *ctx,
|
||||
struct dpu_hw_sharp_cfg *cfg);
|
||||
|
||||
|
||||
/**
|
||||
* setup_qos_lut - setup QoS LUTs
|
||||
* @setup_qos_lut: setup QoS LUTs
|
||||
* @ctx: Pointer to pipe context
|
||||
* @cfg: LUT configuration
|
||||
*/
|
||||
@ -253,7 +253,7 @@ struct dpu_hw_sspp_ops {
|
||||
struct dpu_hw_qos_cfg *cfg);
|
||||
|
||||
/**
|
||||
* setup_qos_ctrl - setup QoS control
|
||||
* @setup_qos_ctrl: setup QoS control
|
||||
* @ctx: Pointer to pipe context
|
||||
* @danger_safe_en: flags controlling enabling of danger/safe QoS/LUT
|
||||
*/
|
||||
@ -261,7 +261,7 @@ struct dpu_hw_sspp_ops {
|
||||
bool danger_safe_en);
|
||||
|
||||
/**
|
||||
* setup_clk_force_ctrl - setup clock force control
|
||||
* @setup_clk_force_ctrl: setup clock force control
|
||||
* @ctx: Pointer to pipe context
|
||||
* @enable: enable clock force if true
|
||||
*/
|
||||
@ -269,7 +269,7 @@ struct dpu_hw_sspp_ops {
|
||||
bool enable);
|
||||
|
||||
/**
|
||||
* setup_histogram - setup histograms
|
||||
* @setup_histogram: setup histograms
|
||||
* @ctx: Pointer to pipe context
|
||||
* @cfg: Pointer to histogram configuration
|
||||
*/
|
||||
@ -277,7 +277,7 @@ struct dpu_hw_sspp_ops {
|
||||
void *cfg);
|
||||
|
||||
/**
|
||||
* setup_scaler - setup scaler
|
||||
* @setup_scaler: setup scaler
|
||||
* @scaler3_cfg: Pointer to scaler configuration
|
||||
* @format: pixel format parameters
|
||||
*/
|
||||
@ -286,7 +286,7 @@ struct dpu_hw_sspp_ops {
|
||||
const struct msm_format *format);
|
||||
|
||||
/**
|
||||
* setup_cdp - setup client driven prefetch
|
||||
* @setup_cdp: setup client driven prefetch
|
||||
* @pipe: Pointer to software pipe context
|
||||
* @fmt: format used by the sw pipe
|
||||
* @enable: whether the CDP should be enabled for this pipe
|
||||
@ -303,6 +303,7 @@ struct dpu_hw_sspp_ops {
|
||||
* @ubwc: UBWC configuration data
|
||||
* @idx: pipe index
|
||||
* @cap: pointer to layer_cfg
|
||||
* @mdss_ver: MDSS version info to use for feature checks
|
||||
* @ops: pointer to operations possible for this pipe
|
||||
*/
|
||||
struct dpu_hw_sspp {
|
||||
|
||||
@ -77,12 +77,11 @@ enum dpu_dp_phy_sel {
|
||||
/**
|
||||
* struct dpu_hw_mdp_ops - interface to the MDP TOP Hw driver functions
|
||||
* Assumption is these functions will be called after clocks are enabled.
|
||||
* @setup_split_pipe : Programs the pipe control registers
|
||||
* @setup_pp_split : Programs the pp split control registers
|
||||
* @setup_traffic_shaper : programs traffic shaper control
|
||||
*/
|
||||
struct dpu_hw_mdp_ops {
|
||||
/** setup_split_pipe() : Registers are not double buffered, thisk
|
||||
/**
|
||||
* @setup_split_pipe : Programs the pipe control registers.
|
||||
* Registers are not double buffered, this
|
||||
* function should be called before timing control enable
|
||||
* @mdp : mdp top context driver
|
||||
* @cfg : upper and lower part of pipe configuration
|
||||
@ -91,7 +90,7 @@ struct dpu_hw_mdp_ops {
|
||||
struct split_pipe_cfg *p);
|
||||
|
||||
/**
|
||||
* setup_traffic_shaper() : Setup traffic shaper control
|
||||
* @setup_traffic_shaper : programs traffic shaper control.
|
||||
* @mdp : mdp top context driver
|
||||
* @cfg : traffic shaper configuration
|
||||
*/
|
||||
@ -99,7 +98,7 @@ struct dpu_hw_mdp_ops {
|
||||
struct traffic_shaper_cfg *cfg);
|
||||
|
||||
/**
|
||||
* setup_clk_force_ctrl - set clock force control
|
||||
* @setup_clk_force_ctrl: set clock force control
|
||||
* @mdp: mdp top context driver
|
||||
* @clk_ctrl: clock to be controlled
|
||||
* @enable: force on enable
|
||||
@ -109,7 +108,7 @@ struct dpu_hw_mdp_ops {
|
||||
enum dpu_clk_ctrl_type clk_ctrl, bool enable);
|
||||
|
||||
/**
|
||||
* get_danger_status - get danger status
|
||||
* @get_danger_status: get danger status
|
||||
* @mdp: mdp top context driver
|
||||
* @status: Pointer to danger safe status
|
||||
*/
|
||||
@ -117,7 +116,7 @@ struct dpu_hw_mdp_ops {
|
||||
struct dpu_danger_safe_status *status);
|
||||
|
||||
/**
|
||||
* setup_vsync_source - setup vsync source configuration details
|
||||
* @setup_vsync_source: setup vsync source configuration details
|
||||
* @mdp: mdp top context driver
|
||||
* @cfg: vsync source selection configuration
|
||||
*/
|
||||
@ -125,7 +124,7 @@ struct dpu_hw_mdp_ops {
|
||||
struct dpu_vsync_source_cfg *cfg);
|
||||
|
||||
/**
|
||||
* get_safe_status - get safe status
|
||||
* @get_safe_status: get safe status
|
||||
* @mdp: mdp top context driver
|
||||
* @status: Pointer to danger safe status
|
||||
*/
|
||||
@ -133,14 +132,14 @@ struct dpu_hw_mdp_ops {
|
||||
struct dpu_danger_safe_status *status);
|
||||
|
||||
/**
|
||||
* dp_phy_intf_sel - configure intf to phy mapping
|
||||
* @dp_phy_intf_sel: configure intf to phy mapping
|
||||
* @mdp: mdp top context driver
|
||||
* @phys: list of phys the DP interfaces should be connected to. 0 disables the INTF.
|
||||
*/
|
||||
void (*dp_phy_intf_sel)(struct dpu_hw_mdp *mdp, enum dpu_dp_phy_sel phys[2]);
|
||||
|
||||
/**
|
||||
* intf_audio_select - select the external interface for audio
|
||||
* @intf_audio_select: select the external interface for audio
|
||||
* @mdp: mdp top context driver
|
||||
*/
|
||||
void (*intf_audio_select)(struct dpu_hw_mdp *mdp);
|
||||
|
||||
@ -17,7 +17,7 @@ struct dpu_hw_vbif;
|
||||
*/
|
||||
struct dpu_hw_vbif_ops {
|
||||
/**
|
||||
* set_limit_conf - set transaction limit config
|
||||
* @set_limit_conf: set transaction limit config
|
||||
* @vbif: vbif context driver
|
||||
* @xin_id: client interface identifier
|
||||
* @rd: true for read limit; false for write limit
|
||||
@ -27,7 +27,7 @@ struct dpu_hw_vbif_ops {
|
||||
u32 xin_id, bool rd, u32 limit);
|
||||
|
||||
/**
|
||||
* get_limit_conf - get transaction limit config
|
||||
* @get_limit_conf: get transaction limit config
|
||||
* @vbif: vbif context driver
|
||||
* @xin_id: client interface identifier
|
||||
* @rd: true for read limit; false for write limit
|
||||
@ -37,7 +37,7 @@ struct dpu_hw_vbif_ops {
|
||||
u32 xin_id, bool rd);
|
||||
|
||||
/**
|
||||
* set_halt_ctrl - set halt control
|
||||
* @set_halt_ctrl: set halt control
|
||||
* @vbif: vbif context driver
|
||||
* @xin_id: client interface identifier
|
||||
* @enable: halt control enable
|
||||
@ -46,7 +46,7 @@ struct dpu_hw_vbif_ops {
|
||||
u32 xin_id, bool enable);
|
||||
|
||||
/**
|
||||
* get_halt_ctrl - get halt control
|
||||
* @get_halt_ctrl: get halt control
|
||||
* @vbif: vbif context driver
|
||||
* @xin_id: client interface identifier
|
||||
* @return: halt control enable
|
||||
@ -55,7 +55,7 @@ struct dpu_hw_vbif_ops {
|
||||
u32 xin_id);
|
||||
|
||||
/**
|
||||
* set_qos_remap - set QoS priority remap
|
||||
* @set_qos_remap: set QoS priority remap
|
||||
* @vbif: vbif context driver
|
||||
* @xin_id: client interface identifier
|
||||
* @level: priority level
|
||||
@ -65,7 +65,7 @@ struct dpu_hw_vbif_ops {
|
||||
u32 xin_id, u32 level, u32 remap_level);
|
||||
|
||||
/**
|
||||
* set_mem_type - set memory type
|
||||
* @set_mem_type: set memory type
|
||||
* @vbif: vbif context driver
|
||||
* @xin_id: client interface identifier
|
||||
* @value: memory type value
|
||||
@ -74,7 +74,7 @@ struct dpu_hw_vbif_ops {
|
||||
u32 xin_id, u32 value);
|
||||
|
||||
/**
|
||||
* clear_errors - clear any vbif errors
|
||||
* @clear_errors: clear any vbif errors
|
||||
* This function clears any detected pending/source errors
|
||||
* on the VBIF interface, and optionally returns the detected
|
||||
* error mask(s).
|
||||
@ -86,7 +86,7 @@ struct dpu_hw_vbif_ops {
|
||||
u32 *pnd_errors, u32 *src_errors);
|
||||
|
||||
/**
|
||||
* set_write_gather_en - set write_gather enable
|
||||
* @set_write_gather_en: set write_gather enable
|
||||
* @vbif: vbif context driver
|
||||
* @xin_id: client interface identifier
|
||||
*/
|
||||
|
||||
@ -22,11 +22,11 @@ struct dpu_hw_wb_cfg {
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* struct dpu_hw_wb_ops : Interface to the wb hw driver functions
|
||||
* Assumption is these functions will be called after clocks are enabled
|
||||
* @setup_outaddress: setup output address from the writeback job
|
||||
* @setup_outformat: setup output format of writeback block from writeback job
|
||||
* @setup_roi: setup ROI (Region of Interest) parameters
|
||||
* @setup_qos_lut: setup qos LUT for writeback block based on input
|
||||
* @setup_cdp: setup chroma down prefetch block for writeback block
|
||||
* @setup_clk_force_ctrl: setup clock force control
|
||||
@ -61,7 +61,7 @@ struct dpu_hw_wb_ops {
|
||||
* struct dpu_hw_wb : WB driver object
|
||||
* @hw: block hardware details
|
||||
* @idx: hardware index number within type
|
||||
* @wb_hw_caps: hardware capabilities
|
||||
* @caps: hardware capabilities
|
||||
* @ops: function pointers
|
||||
*/
|
||||
struct dpu_hw_wb {
|
||||
|
||||
@ -826,12 +826,8 @@ static int dpu_plane_atomic_check_nosspp(struct drm_plane *plane,
|
||||
struct dpu_plane_state *pstate = to_dpu_plane_state(new_plane_state);
|
||||
struct dpu_sw_pipe_cfg *pipe_cfg;
|
||||
struct dpu_sw_pipe_cfg *r_pipe_cfg;
|
||||
struct dpu_sw_pipe_cfg init_pipe_cfg;
|
||||
struct drm_rect fb_rect = { 0 };
|
||||
const struct drm_display_mode *mode = &crtc_state->adjusted_mode;
|
||||
uint32_t max_linewidth;
|
||||
u32 num_lm;
|
||||
int stage_id, num_stages;
|
||||
|
||||
min_scale = FRAC_16_16(1, MAX_UPSCALE_RATIO);
|
||||
max_scale = MAX_DOWNSCALE_RATIO << 16;
|
||||
@ -854,10 +850,13 @@ static int dpu_plane_atomic_check_nosspp(struct drm_plane *plane,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
num_lm = dpu_crtc_get_num_lm(crtc_state);
|
||||
|
||||
/* move the assignment here, to ease handling to another pairs later */
|
||||
pipe_cfg = &pstate->pipe_cfg[0];
|
||||
r_pipe_cfg = &pstate->pipe_cfg[1];
|
||||
/* state->src is 16.16, src_rect is not */
|
||||
drm_rect_fp_to_int(&init_pipe_cfg.src_rect, &new_plane_state->src);
|
||||
drm_rect_fp_to_int(&pipe_cfg->src_rect, &new_plane_state->src);
|
||||
|
||||
pipe_cfg->dst_rect = new_plane_state->dst;
|
||||
|
||||
fb_rect.x2 = new_plane_state->fb->width;
|
||||
fb_rect.y2 = new_plane_state->fb->height;
|
||||
@ -882,94 +881,35 @@ static int dpu_plane_atomic_check_nosspp(struct drm_plane *plane,
|
||||
|
||||
max_linewidth = pdpu->catalog->caps->max_linewidth;
|
||||
|
||||
drm_rect_rotate(&init_pipe_cfg.src_rect,
|
||||
drm_rect_rotate(&pipe_cfg->src_rect,
|
||||
new_plane_state->fb->width, new_plane_state->fb->height,
|
||||
new_plane_state->rotation);
|
||||
|
||||
/*
|
||||
* We have 1 mixer pair cfg for 1:1:1 and 2:2:1 topology, 2 mixer pair
|
||||
* configs for left and right half screen in case of 4:4:2 topology.
|
||||
* But we may have 2 rect to split wide plane that exceeds limit with 1
|
||||
* config for 2:2:1. So need to handle both wide plane splitting, and
|
||||
* two halves of screen splitting for quad-pipe case. Check dest
|
||||
* rectangle left/right clipping first, then check wide rectangle
|
||||
* splitting in every half next.
|
||||
*/
|
||||
num_stages = (num_lm + 1) / 2;
|
||||
/* iterate mixer configs for this plane, to separate left/right with the id */
|
||||
for (stage_id = 0; stage_id < num_stages; stage_id++) {
|
||||
struct drm_rect mixer_rect = {
|
||||
.x1 = stage_id * mode->hdisplay / num_stages,
|
||||
.y1 = 0,
|
||||
.x2 = (stage_id + 1) * mode->hdisplay / num_stages,
|
||||
.y2 = mode->vdisplay
|
||||
};
|
||||
int cfg_idx = stage_id * PIPES_PER_STAGE;
|
||||
|
||||
pipe_cfg = &pstate->pipe_cfg[cfg_idx];
|
||||
r_pipe_cfg = &pstate->pipe_cfg[cfg_idx + 1];
|
||||
|
||||
drm_rect_fp_to_int(&pipe_cfg->src_rect, &new_plane_state->src);
|
||||
pipe_cfg->dst_rect = new_plane_state->dst;
|
||||
|
||||
DPU_DEBUG_PLANE(pdpu, "checking src " DRM_RECT_FMT
|
||||
" vs clip window " DRM_RECT_FMT "\n",
|
||||
DRM_RECT_ARG(&pipe_cfg->src_rect),
|
||||
DRM_RECT_ARG(&mixer_rect));
|
||||
|
||||
/*
|
||||
* If this plane does not fall into mixer rect, check next
|
||||
* mixer rect.
|
||||
*/
|
||||
if (!drm_rect_clip_scaled(&pipe_cfg->src_rect,
|
||||
&pipe_cfg->dst_rect,
|
||||
&mixer_rect)) {
|
||||
memset(pipe_cfg, 0, 2 * sizeof(struct dpu_sw_pipe_cfg));
|
||||
|
||||
continue;
|
||||
if ((drm_rect_width(&pipe_cfg->src_rect) > max_linewidth) ||
|
||||
_dpu_plane_calc_clk(&crtc_state->adjusted_mode, pipe_cfg) > max_mdp_clk_rate) {
|
||||
if (drm_rect_width(&pipe_cfg->src_rect) > 2 * max_linewidth) {
|
||||
DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u\n",
|
||||
DRM_RECT_ARG(&pipe_cfg->src_rect), max_linewidth);
|
||||
return -E2BIG;
|
||||
}
|
||||
|
||||
pipe_cfg->dst_rect.x1 -= mixer_rect.x1;
|
||||
pipe_cfg->dst_rect.x2 -= mixer_rect.x1;
|
||||
|
||||
DPU_DEBUG_PLANE(pdpu, "Got clip src:" DRM_RECT_FMT " dst: " DRM_RECT_FMT "\n",
|
||||
DRM_RECT_ARG(&pipe_cfg->src_rect), DRM_RECT_ARG(&pipe_cfg->dst_rect));
|
||||
|
||||
/* Split wide rect into 2 rect */
|
||||
if ((drm_rect_width(&pipe_cfg->src_rect) > max_linewidth) ||
|
||||
_dpu_plane_calc_clk(mode, pipe_cfg) > max_mdp_clk_rate) {
|
||||
|
||||
if (drm_rect_width(&pipe_cfg->src_rect) > 2 * max_linewidth) {
|
||||
DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u\n",
|
||||
DRM_RECT_ARG(&pipe_cfg->src_rect), max_linewidth);
|
||||
return -E2BIG;
|
||||
}
|
||||
|
||||
memcpy(r_pipe_cfg, pipe_cfg, sizeof(struct dpu_sw_pipe_cfg));
|
||||
pipe_cfg->src_rect.x2 = (pipe_cfg->src_rect.x1 + pipe_cfg->src_rect.x2) >> 1;
|
||||
pipe_cfg->dst_rect.x2 = (pipe_cfg->dst_rect.x1 + pipe_cfg->dst_rect.x2) >> 1;
|
||||
r_pipe_cfg->src_rect.x1 = pipe_cfg->src_rect.x2;
|
||||
r_pipe_cfg->dst_rect.x1 = pipe_cfg->dst_rect.x2;
|
||||
DPU_DEBUG_PLANE(pdpu, "Split wide plane into:"
|
||||
DRM_RECT_FMT " and " DRM_RECT_FMT "\n",
|
||||
DRM_RECT_ARG(&pipe_cfg->src_rect),
|
||||
DRM_RECT_ARG(&r_pipe_cfg->src_rect));
|
||||
} else {
|
||||
memset(r_pipe_cfg, 0, sizeof(struct dpu_sw_pipe_cfg));
|
||||
}
|
||||
|
||||
drm_rect_rotate_inv(&pipe_cfg->src_rect,
|
||||
new_plane_state->fb->width,
|
||||
new_plane_state->fb->height,
|
||||
new_plane_state->rotation);
|
||||
|
||||
if (drm_rect_width(&r_pipe_cfg->src_rect) != 0)
|
||||
drm_rect_rotate_inv(&r_pipe_cfg->src_rect,
|
||||
new_plane_state->fb->width,
|
||||
new_plane_state->fb->height,
|
||||
new_plane_state->rotation);
|
||||
*r_pipe_cfg = *pipe_cfg;
|
||||
pipe_cfg->src_rect.x2 = (pipe_cfg->src_rect.x1 + pipe_cfg->src_rect.x2) >> 1;
|
||||
pipe_cfg->dst_rect.x2 = (pipe_cfg->dst_rect.x1 + pipe_cfg->dst_rect.x2) >> 1;
|
||||
r_pipe_cfg->src_rect.x1 = pipe_cfg->src_rect.x2;
|
||||
r_pipe_cfg->dst_rect.x1 = pipe_cfg->dst_rect.x2;
|
||||
} else {
|
||||
memset(r_pipe_cfg, 0, sizeof(*r_pipe_cfg));
|
||||
}
|
||||
|
||||
drm_rect_rotate_inv(&pipe_cfg->src_rect,
|
||||
new_plane_state->fb->width, new_plane_state->fb->height,
|
||||
new_plane_state->rotation);
|
||||
if (drm_rect_width(&r_pipe_cfg->src_rect) != 0)
|
||||
drm_rect_rotate_inv(&r_pipe_cfg->src_rect,
|
||||
new_plane_state->fb->width, new_plane_state->fb->height,
|
||||
new_plane_state->rotation);
|
||||
|
||||
pstate->needs_qos_remap = drm_atomic_crtc_needs_modeset(crtc_state);
|
||||
|
||||
return 0;
|
||||
@ -1045,17 +985,20 @@ static int dpu_plane_atomic_check_sspp(struct drm_plane *plane,
|
||||
drm_atomic_get_new_plane_state(state, plane);
|
||||
struct dpu_plane *pdpu = to_dpu_plane(plane);
|
||||
struct dpu_plane_state *pstate = to_dpu_plane_state(new_plane_state);
|
||||
struct dpu_sw_pipe *pipe;
|
||||
struct dpu_sw_pipe_cfg *pipe_cfg;
|
||||
int ret = 0, i;
|
||||
struct dpu_sw_pipe *pipe = &pstate->pipe[0];
|
||||
struct dpu_sw_pipe *r_pipe = &pstate->pipe[1];
|
||||
struct dpu_sw_pipe_cfg *pipe_cfg = &pstate->pipe_cfg[0];
|
||||
struct dpu_sw_pipe_cfg *r_pipe_cfg = &pstate->pipe_cfg[1];
|
||||
int ret = 0;
|
||||
|
||||
for (i = 0; i < PIPES_PER_PLANE; i++) {
|
||||
pipe = &pstate->pipe[i];
|
||||
pipe_cfg = &pstate->pipe_cfg[i];
|
||||
if (!drm_rect_width(&pipe_cfg->src_rect))
|
||||
continue;
|
||||
DPU_DEBUG_PLANE(pdpu, "pipe %d is in use, validate it\n", i);
|
||||
ret = dpu_plane_atomic_check_pipe(pdpu, pipe, pipe_cfg,
|
||||
ret = dpu_plane_atomic_check_pipe(pdpu, pipe, pipe_cfg,
|
||||
&crtc_state->adjusted_mode,
|
||||
new_plane_state);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (drm_rect_width(&r_pipe_cfg->src_rect) != 0) {
|
||||
ret = dpu_plane_atomic_check_pipe(pdpu, r_pipe, r_pipe_cfg,
|
||||
&crtc_state->adjusted_mode,
|
||||
new_plane_state);
|
||||
if (ret)
|
||||
|
||||
@ -24,7 +24,7 @@ enum msm_format_flags {
|
||||
#define MSM_FORMAT_FLAG_UNPACK_TIGHT BIT(MSM_FORMAT_FLAG_UNPACK_TIGHT_BIT)
|
||||
#define MSM_FORMAT_FLAG_UNPACK_ALIGN_MSB BIT(MSM_FORMAT_FLAG_UNPACK_ALIGN_MSB_BIT)
|
||||
|
||||
/**
|
||||
/*
|
||||
* DPU HW,Component order color map
|
||||
*/
|
||||
enum {
|
||||
@ -37,6 +37,10 @@ enum {
|
||||
/**
|
||||
* struct msm_format: defines the format configuration
|
||||
* @pixel_format: format fourcc
|
||||
* @bpc_g_y: element bit widths: BPC for G or Y
|
||||
* @bpc_b_cb: element bit widths: BPC for B or Cb
|
||||
* @bpc_r_cr: element bit widths: BPC for R or Cr
|
||||
* @bpc_a: element bit widths: BPC for the alpha channel
|
||||
* @element: element color ordering
|
||||
* @fetch_type: how the color components are packed in pixel format
|
||||
* @chroma_sample: chroma sub-samplng type
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
|
||||
/**
|
||||
* msm_dp_debug_get() - configure and get the DisplayPlot debug module data
|
||||
* msm_dp_debug_init() - configure and get the DisplayPlot debug module data
|
||||
*
|
||||
* @dev: device instance of the caller
|
||||
* @panel: instance of panel module
|
||||
|
||||
@ -18,6 +18,7 @@
|
||||
/**
|
||||
* msm_dp_bridge_detect - callback to determine if connector is connected
|
||||
* @bridge: Pointer to drm bridge structure
|
||||
* @connector: Pointer to drm connector structure
|
||||
* Returns: Bridge's 'is connected' status
|
||||
*/
|
||||
static enum drm_connector_status
|
||||
|
||||
@ -80,11 +80,11 @@ struct msm_dp_link {
|
||||
};
|
||||
|
||||
/**
|
||||
* mdss_dp_test_bit_depth_to_bpp() - convert test bit depth to bpp
|
||||
* msm_dp_link_bit_depth_to_bpp() - convert test bit depth to bpp
|
||||
* @tbd: test bit depth
|
||||
*
|
||||
* Returns the bits per pixel (bpp) to be used corresponding to the
|
||||
* git bit depth value. This function assumes that bit depth has
|
||||
* Returns: the bits per pixel (bpp) to be used corresponding to the
|
||||
* bit depth value. This function assumes that bit depth has
|
||||
* already been validated.
|
||||
*/
|
||||
static inline u32 msm_dp_link_bit_depth_to_bpp(u32 tbd)
|
||||
@ -120,7 +120,8 @@ bool msm_dp_link_send_edid_checksum(struct msm_dp_link *msm_dp_link, u8 checksum
|
||||
|
||||
/**
|
||||
* msm_dp_link_get() - get the functionalities of dp test module
|
||||
*
|
||||
* @dev: kernel device structure
|
||||
* @aux: DisplayPort AUX channel
|
||||
*
|
||||
* return: a pointer to msm_dp_link struct
|
||||
*/
|
||||
|
||||
@ -63,9 +63,9 @@ void msm_dp_panel_disable_vsc_sdp(struct msm_dp_panel *msm_dp_panel);
|
||||
|
||||
/**
|
||||
* is_link_rate_valid() - validates the link rate
|
||||
* @lane_rate: link rate requested by the sink
|
||||
* @bw_code: link rate requested by the sink
|
||||
*
|
||||
* Returns true if the requested link rate is supported.
|
||||
* Returns: true if the requested link rate is supported.
|
||||
*/
|
||||
static inline bool is_link_rate_valid(u32 bw_code)
|
||||
{
|
||||
@ -76,10 +76,10 @@ static inline bool is_link_rate_valid(u32 bw_code)
|
||||
}
|
||||
|
||||
/**
|
||||
* msm_dp_link_is_lane_count_valid() - validates the lane count
|
||||
* is_lane_count_valid() - validates the lane count
|
||||
* @lane_count: lane count requested by the sink
|
||||
*
|
||||
* Returns true if the requested lane count is supported.
|
||||
* Returns: true if the requested lane count is supported.
|
||||
*/
|
||||
static inline bool is_lane_count_valid(u32 lane_count)
|
||||
{
|
||||
|
||||
@ -16,34 +16,29 @@
|
||||
* incrementing fence seqno at the end of each submit
|
||||
*/
|
||||
struct msm_fence_context {
|
||||
/** @dev: the drm device */
|
||||
struct drm_device *dev;
|
||||
/** name: human readable name for fence timeline */
|
||||
/** @name: human readable name for fence timeline */
|
||||
char name[32];
|
||||
/** context: see dma_fence_context_alloc() */
|
||||
/** @context: see dma_fence_context_alloc() */
|
||||
unsigned context;
|
||||
/** index: similar to context, but local to msm_fence_context's */
|
||||
/** @index: similar to context, but local to msm_fence_context's */
|
||||
unsigned index;
|
||||
|
||||
/**
|
||||
* last_fence:
|
||||
*
|
||||
* @last_fence:
|
||||
* Last assigned fence, incremented each time a fence is created
|
||||
* on this fence context. If last_fence == completed_fence,
|
||||
* there is no remaining pending work
|
||||
*/
|
||||
uint32_t last_fence;
|
||||
|
||||
/**
|
||||
* completed_fence:
|
||||
*
|
||||
* @completed_fence:
|
||||
* The last completed fence, updated from the CPU after interrupt
|
||||
* from GPU
|
||||
*/
|
||||
uint32_t completed_fence;
|
||||
|
||||
/**
|
||||
* fenceptr:
|
||||
*
|
||||
* @fenceptr:
|
||||
* The address that the GPU directly writes with completed fence
|
||||
* seqno. This can be ahead of completed_fence. We can peek at
|
||||
* this to see if a fence has already signaled but the CPU hasn't
|
||||
@ -51,6 +46,9 @@ struct msm_fence_context {
|
||||
*/
|
||||
volatile uint32_t *fenceptr;
|
||||
|
||||
/**
|
||||
* @spinlock: fence context spinlock
|
||||
*/
|
||||
spinlock_t spinlock;
|
||||
|
||||
/*
|
||||
@ -59,18 +57,22 @@ struct msm_fence_context {
|
||||
* don't queue, so maybe that is ok
|
||||
*/
|
||||
|
||||
/** next_deadline: Time of next deadline */
|
||||
/** @next_deadline: Time of next deadline */
|
||||
ktime_t next_deadline;
|
||||
|
||||
/**
|
||||
* next_deadline_fence:
|
||||
*
|
||||
* @next_deadline_fence:
|
||||
* Fence value for next pending deadline. The deadline timer is
|
||||
* canceled when this fence is signaled.
|
||||
*/
|
||||
uint32_t next_deadline_fence;
|
||||
|
||||
/**
|
||||
* @deadline_timer: tracks nearest deadline of a fence timeline and
|
||||
* expires just before it.
|
||||
*/
|
||||
struct hrtimer deadline_timer;
|
||||
/**
|
||||
* @deadline_work: work to do after deadline_timer expires
|
||||
*/
|
||||
struct kthread_work deadline_work;
|
||||
};
|
||||
|
||||
|
||||
@ -65,7 +65,7 @@ struct msm_vm_unmap_op {
|
||||
};
|
||||
|
||||
/**
|
||||
* struct msm_vma_op - A MAP or UNMAP operation
|
||||
* struct msm_vm_op - A MAP or UNMAP operation
|
||||
*/
|
||||
struct msm_vm_op {
|
||||
/** @op: The operation type */
|
||||
@ -798,6 +798,9 @@ static const struct drm_sched_backend_ops msm_vm_bind_ops = {
|
||||
* synchronous operations are supported. In a user managed VM, userspace
|
||||
* handles virtual address allocation, and both async and sync operations
|
||||
* are supported.
|
||||
*
|
||||
* Returns: pointer to the created &struct drm_gpuvm on success
|
||||
* or an ERR_PTR(-errno) on failure.
|
||||
*/
|
||||
struct drm_gpuvm *
|
||||
msm_gem_vm_create(struct drm_device *drm, struct msm_mmu *mmu, const char *name,
|
||||
|
||||
@ -116,15 +116,12 @@ struct msm_gpu_fault_info {
|
||||
* struct msm_gpu_devfreq - devfreq related state
|
||||
*/
|
||||
struct msm_gpu_devfreq {
|
||||
/** devfreq: devfreq instance */
|
||||
/** @devfreq: devfreq instance */
|
||||
struct devfreq *devfreq;
|
||||
|
||||
/** lock: lock for "suspended", "busy_cycles", and "time" */
|
||||
/** @lock: lock for "suspended", "busy_cycles", and "time" */
|
||||
struct mutex lock;
|
||||
|
||||
/**
|
||||
* idle_freq:
|
||||
*
|
||||
* @idle_freq:
|
||||
* Shadow frequency used while the GPU is idle. From the PoV of
|
||||
* the devfreq governor, we are continuing to sample busyness and
|
||||
* adjust frequency while the GPU is idle, but we use this shadow
|
||||
@ -132,43 +129,34 @@ struct msm_gpu_devfreq {
|
||||
* it is inactive.
|
||||
*/
|
||||
unsigned long idle_freq;
|
||||
|
||||
/**
|
||||
* boost_constraint:
|
||||
*
|
||||
* @boost_freq:
|
||||
* A PM QoS constraint to boost min freq for a period of time
|
||||
* until the boost expires.
|
||||
*/
|
||||
struct dev_pm_qos_request boost_freq;
|
||||
|
||||
/**
|
||||
* busy_cycles: Last busy counter value, for calculating elapsed busy
|
||||
* @busy_cycles: Last busy counter value, for calculating elapsed busy
|
||||
* cycles since last sampling period.
|
||||
*/
|
||||
u64 busy_cycles;
|
||||
|
||||
/** time: Time of last sampling period. */
|
||||
/** @time: Time of last sampling period. */
|
||||
ktime_t time;
|
||||
|
||||
/** idle_time: Time of last transition to idle: */
|
||||
/** @idle_time: Time of last transition to idle. */
|
||||
ktime_t idle_time;
|
||||
|
||||
/**
|
||||
* idle_work:
|
||||
*
|
||||
* @idle_work:
|
||||
* Used to delay clamping to idle freq on active->idle transition.
|
||||
*/
|
||||
struct msm_hrtimer_work idle_work;
|
||||
|
||||
/**
|
||||
* boost_work:
|
||||
*
|
||||
* @boost_work:
|
||||
* Used to reset the boost_constraint after the boost period has
|
||||
* elapsed
|
||||
*/
|
||||
struct msm_hrtimer_work boost_work;
|
||||
|
||||
/** suspended: tracks if we're suspended */
|
||||
/** @suspended: tracks if we're suspended */
|
||||
bool suspended;
|
||||
};
|
||||
|
||||
@ -358,57 +346,43 @@ struct msm_gpu_perfcntr {
|
||||
struct msm_context {
|
||||
/** @queuelock: synchronizes access to submitqueues list */
|
||||
rwlock_t queuelock;
|
||||
|
||||
/** @submitqueues: list of &msm_gpu_submitqueue created by userspace */
|
||||
struct list_head submitqueues;
|
||||
|
||||
/**
|
||||
* @queueid:
|
||||
*
|
||||
* Counter incremented each time a submitqueue is created, used to
|
||||
* assign &msm_gpu_submitqueue.id
|
||||
*/
|
||||
int queueid;
|
||||
|
||||
/**
|
||||
* @closed: The device file associated with this context has been closed.
|
||||
*
|
||||
* Once the device is closed, any submits that have not been written
|
||||
* to the ring buffer are no-op'd.
|
||||
*/
|
||||
bool closed;
|
||||
|
||||
/**
|
||||
* @userspace_managed_vm:
|
||||
*
|
||||
* Has userspace opted-in to userspace managed VM (ie. VM_BIND) via
|
||||
* MSM_PARAM_EN_VM_BIND?
|
||||
*/
|
||||
bool userspace_managed_vm;
|
||||
|
||||
/**
|
||||
* @vm:
|
||||
*
|
||||
* The per-process GPU address-space. Do not access directly, use
|
||||
* msm_context_vm().
|
||||
*/
|
||||
struct drm_gpuvm *vm;
|
||||
|
||||
/** @kref: the reference count */
|
||||
/** @ref: the reference count */
|
||||
struct kref ref;
|
||||
|
||||
/**
|
||||
* @seqno:
|
||||
*
|
||||
* A unique per-process sequence number. Used to detect context
|
||||
* switches, without relying on keeping a, potentially dangling,
|
||||
* pointer to the previous context.
|
||||
*/
|
||||
int seqno;
|
||||
|
||||
/**
|
||||
* @sysprof:
|
||||
*
|
||||
* The value of MSM_PARAM_SYSPROF set by userspace. This is
|
||||
* intended to be used by system profiling tools like Mesa's
|
||||
* pps-producer (perfetto), and restricted to CAP_SYS_ADMIN.
|
||||
@ -423,40 +397,32 @@ struct msm_context {
|
||||
* file is closed.
|
||||
*/
|
||||
int sysprof;
|
||||
|
||||
/**
|
||||
* @comm: Overridden task comm, see MSM_PARAM_COMM
|
||||
*
|
||||
* Accessed under msm_gpu::lock
|
||||
*/
|
||||
char *comm;
|
||||
|
||||
/**
|
||||
* @cmdline: Overridden task cmdline, see MSM_PARAM_CMDLINE
|
||||
*
|
||||
* Accessed under msm_gpu::lock
|
||||
*/
|
||||
char *cmdline;
|
||||
|
||||
/**
|
||||
* @elapsed:
|
||||
*
|
||||
* @elapsed_ns:
|
||||
* The total (cumulative) elapsed time GPU was busy with rendering
|
||||
* from this context in ns.
|
||||
*/
|
||||
uint64_t elapsed_ns;
|
||||
|
||||
/**
|
||||
* @cycles:
|
||||
*
|
||||
* The total (cumulative) GPU cycles elapsed attributed to this
|
||||
* context.
|
||||
*/
|
||||
uint64_t cycles;
|
||||
|
||||
/**
|
||||
* @entities:
|
||||
*
|
||||
* Table of per-priority-level sched entities used by submitqueues
|
||||
* associated with this &drm_file. Because some userspace apps
|
||||
* make assumptions about rendering from multiple gl contexts
|
||||
@ -466,10 +432,8 @@ struct msm_context {
|
||||
* level.
|
||||
*/
|
||||
struct drm_sched_entity *entities[NR_SCHED_PRIORITIES * MSM_GPU_MAX_RINGS];
|
||||
|
||||
/**
|
||||
* @ctx_mem:
|
||||
*
|
||||
* Total amount of memory of GEM buffers with handles attached for
|
||||
* this context.
|
||||
*/
|
||||
@ -479,7 +443,7 @@ struct msm_context {
|
||||
struct drm_gpuvm *msm_context_vm(struct drm_device *dev, struct msm_context *ctx);
|
||||
|
||||
/**
|
||||
* msm_context_is_vm_bind() - has userspace opted in to VM_BIND?
|
||||
* msm_context_is_vmbind() - has userspace opted in to VM_BIND?
|
||||
*
|
||||
* @ctx: the drm_file context
|
||||
*
|
||||
@ -487,6 +451,8 @@ struct drm_gpuvm *msm_context_vm(struct drm_device *dev, struct msm_context *ctx
|
||||
* do sparse binding including having multiple, potentially partial,
|
||||
* mappings in the VM. Therefore certain legacy uabi (ie. GET_IOVA,
|
||||
* SET_IOVA) are rejected because they don't have a sensible meaning.
|
||||
*
|
||||
* Returns: %true if userspace is managing the VM, %false otherwise.
|
||||
*/
|
||||
static inline bool
|
||||
msm_context_is_vmbind(struct msm_context *ctx)
|
||||
@ -518,6 +484,8 @@ msm_context_is_vmbind(struct msm_context *ctx)
|
||||
* This allows generations without preemption (nr_rings==1) to have some
|
||||
* amount of prioritization, and provides more priority levels for gens
|
||||
* that do have preemption.
|
||||
*
|
||||
* Returns: %0 on success, %-errno on error.
|
||||
*/
|
||||
static inline int msm_gpu_convert_priority(struct msm_gpu *gpu, int prio,
|
||||
unsigned *ring_nr, enum drm_sched_priority *sched_prio)
|
||||
@ -541,7 +509,7 @@ static inline int msm_gpu_convert_priority(struct msm_gpu *gpu, int prio,
|
||||
}
|
||||
|
||||
/**
|
||||
* struct msm_gpu_submitqueues - Userspace created context.
|
||||
* struct msm_gpu_submitqueue - Userspace created context.
|
||||
*
|
||||
* A submitqueue is associated with a gl context or vk queue (or equiv)
|
||||
* in userspace.
|
||||
|
||||
@ -364,7 +364,7 @@ msm_iommu_pagetable_prealloc_cleanup(struct msm_mmu *mmu, struct msm_mmu_preallo
|
||||
}
|
||||
|
||||
/**
|
||||
* alloc_pt() - Custom page table allocator
|
||||
* msm_iommu_pagetable_alloc_pt() - Custom page table allocator
|
||||
* @cookie: Cookie passed at page table allocation time.
|
||||
* @size: Size of the page table. This size should be fixed,
|
||||
* and determined at creation time based on the granule size.
|
||||
@ -416,7 +416,7 @@ msm_iommu_pagetable_alloc_pt(void *cookie, size_t size, gfp_t gfp)
|
||||
|
||||
|
||||
/**
|
||||
* free_pt() - Custom page table free function
|
||||
* msm_iommu_pagetable_free_pt() - Custom page table free function
|
||||
* @cookie: Cookie passed at page table allocation time.
|
||||
* @data: Page table to free.
|
||||
* @size: Size of the page table. This size should be fixed,
|
||||
|
||||
@ -65,13 +65,13 @@ static int refill_buf(struct msm_perf_state *perf)
|
||||
|
||||
if ((perf->cnt++ % 32) == 0) {
|
||||
/* Header line: */
|
||||
n = snprintf(ptr, rem, "%%BUSY");
|
||||
n = scnprintf(ptr, rem, "%%BUSY");
|
||||
ptr += n;
|
||||
rem -= n;
|
||||
|
||||
for (i = 0; i < gpu->num_perfcntrs; i++) {
|
||||
const struct msm_gpu_perfcntr *perfcntr = &gpu->perfcntrs[i];
|
||||
n = snprintf(ptr, rem, "\t%s", perfcntr->name);
|
||||
n = scnprintf(ptr, rem, "\t%s", perfcntr->name);
|
||||
ptr += n;
|
||||
rem -= n;
|
||||
}
|
||||
@ -93,21 +93,21 @@ static int refill_buf(struct msm_perf_state *perf)
|
||||
return ret;
|
||||
|
||||
val = totaltime ? 1000 * activetime / totaltime : 0;
|
||||
n = snprintf(ptr, rem, "%3d.%d%%", val / 10, val % 10);
|
||||
n = scnprintf(ptr, rem, "%3d.%d%%", val / 10, val % 10);
|
||||
ptr += n;
|
||||
rem -= n;
|
||||
|
||||
for (i = 0; i < ret; i++) {
|
||||
/* cycle counters (I think).. convert to MHz.. */
|
||||
val = cntrs[i] / 10000;
|
||||
n = snprintf(ptr, rem, "\t%5d.%02d",
|
||||
n = scnprintf(ptr, rem, "\t%5d.%02d",
|
||||
val / 100, val % 100);
|
||||
ptr += n;
|
||||
rem -= n;
|
||||
}
|
||||
}
|
||||
|
||||
n = snprintf(ptr, rem, "\n");
|
||||
n = scnprintf(ptr, rem, "\n");
|
||||
ptr += n;
|
||||
rem -= n;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user