3be27eafcc
This snapshot ports changes from 4.14 to 4.19 into the msm and sde layer. Snapshot was taken as of commit 0f8fb25421ff ("cnss2: Add device version to SOC info structure"). Change-Id: I59b799a78319c2db6930a2a10bc38976f8c09898 Signed-off-by: Samantha Tran <samtran@codeaurora.org>
101 lines
2.0 KiB
C
101 lines
2.0 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Copyright (c) 2019, The Linux Foundation. All rights reserved.
|
|
*/
|
|
|
|
#define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
|
|
|
|
#include <linux/mutex.h>
|
|
#include <linux/platform_device.h>
|
|
|
|
#include "sde_kms.h"
|
|
#include "sde_dbg.h"
|
|
#include "sde_hw_qdss.h"
|
|
|
|
#define QDSS_CONFIG 0x0
|
|
|
|
static struct sde_qdss_cfg *_qdss_offset(enum sde_qdss qdss,
|
|
struct sde_mdss_cfg *m,
|
|
void __iomem *addr,
|
|
struct sde_hw_blk_reg_map *b)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < m->qdss_count; i++) {
|
|
if (qdss == m->qdss[i].id) {
|
|
b->base_off = addr;
|
|
b->blk_off = m->qdss[i].base;
|
|
b->length = m->qdss[i].len;
|
|
b->hwversion = m->hwversion;
|
|
b->log_mask = SDE_DBG_MASK_QDSS;
|
|
return &m->qdss[i];
|
|
}
|
|
}
|
|
|
|
return ERR_PTR(-EINVAL);
|
|
}
|
|
|
|
static void sde_hw_qdss_enable_qdss_events(struct sde_hw_qdss *hw_qdss,
|
|
bool enable)
|
|
{
|
|
struct sde_hw_blk_reg_map *c = &hw_qdss->hw;
|
|
u32 val;
|
|
|
|
val = enable ? 0x100 : 0;
|
|
|
|
if (c)
|
|
SDE_REG_WRITE(c, QDSS_CONFIG, val);
|
|
}
|
|
|
|
static void _setup_qdss_ops(struct sde_hw_qdss_ops *ops)
|
|
{
|
|
ops->enable_qdss_events = sde_hw_qdss_enable_qdss_events;
|
|
}
|
|
|
|
static struct sde_hw_blk_ops sde_hw_ops = {
|
|
.start = NULL,
|
|
.stop = NULL,
|
|
};
|
|
|
|
struct sde_hw_qdss *sde_hw_qdss_init(enum sde_qdss idx,
|
|
void __iomem *addr,
|
|
struct sde_mdss_cfg *m)
|
|
{
|
|
struct sde_hw_qdss *c;
|
|
struct sde_qdss_cfg *cfg;
|
|
int rc;
|
|
|
|
c = kzalloc(sizeof(*c), GFP_KERNEL);
|
|
if (!c)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
cfg = _qdss_offset(idx, m, addr, &c->hw);
|
|
if (IS_ERR_OR_NULL(cfg)) {
|
|
kfree(c);
|
|
return ERR_PTR(-EINVAL);
|
|
}
|
|
|
|
c->idx = idx;
|
|
c->caps = cfg;
|
|
_setup_qdss_ops(&c->ops);
|
|
|
|
rc = sde_hw_blk_init(&c->base, SDE_HW_BLK_QDSS, idx, &sde_hw_ops);
|
|
if (rc) {
|
|
SDE_ERROR("failed to init hw blk %d\n", rc);
|
|
kzfree(c);
|
|
return ERR_PTR(rc);
|
|
}
|
|
|
|
sde_dbg_reg_register_dump_range(SDE_DBG_NAME, cfg->name, c->hw.blk_off,
|
|
c->hw.blk_off + c->hw.length, c->hw.xin_id);
|
|
|
|
return c;
|
|
}
|
|
|
|
void sde_hw_qdss_destroy(struct sde_hw_qdss *qdss)
|
|
{
|
|
if (qdss)
|
|
sde_hw_blk_destroy(&qdss->base);
|
|
kfree(qdss);
|
|
}
|