Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions drivers/gpu/drm/msm/adreno/a5xx_gpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1732,6 +1732,7 @@ static struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)
struct adreno_gpu *adreno_gpu;
struct msm_gpu *gpu;
unsigned int nr_rings;
u32 speedbin;
int ret;

a5xx_gpu = kzalloc_obj(*a5xx_gpu);
Expand All @@ -1758,6 +1759,11 @@ static struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)
return ERR_PTR(ret);
}

/* Set the speedbin value that is passed to userspace */
if (adreno_read_speedbin(&pdev->dev, &speedbin) || !speedbin)
speedbin = 0xffff;
adreno_gpu->speedbin = (uint16_t) (0xffff & speedbin);

msm_mmu_set_fault_handler(to_msm_vm(gpu->vm)->mmu, gpu,
a5xx_fault_handler);

Expand Down
9 changes: 8 additions & 1 deletion drivers/gpu/drm/msm/adreno/a6xx_catalog.c
Original file line number Diff line number Diff line change
Expand Up @@ -1902,7 +1902,8 @@ static const struct adreno_info a8xx_gpus[] = {
.gmem = 21 * SZ_1M,
.inactive_period = DRM_MSM_INACTIVE_PERIOD,
.quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT |
ADRENO_QUIRK_HAS_HW_APRIV,
ADRENO_QUIRK_HAS_HW_APRIV |
ADRENO_QUIRK_SOFTFUSE,
.funcs = &a8xx_gpu_funcs,
.a6xx = &(const struct a6xx_info) {
.protect = &x285_protect,
Expand All @@ -1922,6 +1923,12 @@ static const struct adreno_info a8xx_gpus[] = {
{ /* sentinel */ },
},
},
.speedbins = ADRENO_SPEEDBINS(
{ 0, 0 },
{ 388, 1 },
{ 357, 2 },
{ 284, 3 },
),
}, {
.chip_ids = ADRENO_CHIP_IDS(0x44050a01),
.family = ADRENO_8XX_GEN2,
Expand Down
41 changes: 34 additions & 7 deletions drivers/gpu/drm/msm/adreno/a6xx_gpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -2600,13 +2600,33 @@ static u32 fuse_to_supp_hw(const struct adreno_info *info, u32 fuse)
return UINT_MAX;
}

static int a6xx_set_supported_hw(struct device *dev, const struct adreno_info *info)
static int a6xx_read_speedbin(struct device *dev, struct a6xx_gpu *a6xx_gpu,
const struct adreno_info *info, u32 *speedbin)
{
int ret;

/* Use speedbin fuse if present. Otherwise, fallback to softfuse */
ret = adreno_read_speedbin(dev, speedbin);
if (ret != -ENOENT)
return ret;

if (info->quirks & ADRENO_QUIRK_SOFTFUSE) {
*speedbin = a6xx_llc_read(a6xx_gpu, REG_A8XX_CX_MISC_SW_FUSE_FREQ_LIMIT_STATUS);
*speedbin = A8XX_CX_MISC_SW_FUSE_FREQ_LIMIT_STATUS_FINALFREQLIMIT(*speedbin);
return 0;
}

return -ENOENT;
}

static int a6xx_set_supported_hw(struct device *dev, struct a6xx_gpu *a6xx_gpu,
const struct adreno_info *info)
{
u32 supp_hw;
u32 speedbin;
int ret;

ret = adreno_read_speedbin(dev, &speedbin);
ret = a6xx_read_speedbin(dev, a6xx_gpu, info, &speedbin);
/*
* -ENOENT means that the platform doesn't support speedbin which is
* fine
Expand Down Expand Up @@ -2640,11 +2660,13 @@ static struct msm_gpu *a6xx_gpu_init(struct drm_device *dev)
struct msm_drm_private *priv = dev->dev_private;
struct platform_device *pdev = priv->gpu_pdev;
struct adreno_platform_config *config = pdev->dev.platform_data;
const struct adreno_info *info = config->info;
struct device_node *node;
struct a6xx_gpu *a6xx_gpu;
struct adreno_gpu *adreno_gpu;
struct msm_gpu *gpu;
extern int enable_preemption;
u32 speedbin;
bool is_a7xx;
int ret, nr_rings = 1;

Expand All @@ -2667,30 +2689,35 @@ static struct msm_gpu *a6xx_gpu_init(struct drm_device *dev)
adreno_gpu->gmu_is_wrapper = of_device_is_compatible(node, "qcom,adreno-gmu-wrapper");

adreno_gpu->base.hw_apriv =
!!(config->info->quirks & ADRENO_QUIRK_HAS_HW_APRIV);
!!(info->quirks & ADRENO_QUIRK_HAS_HW_APRIV);

/* gpu->info only gets assigned in adreno_gpu_init(). A8x is included intentionally */
is_a7xx = config->info->family >= ADRENO_7XX_GEN1;
is_a7xx = info->family >= ADRENO_7XX_GEN1;

a6xx_llc_slices_init(pdev, a6xx_gpu, is_a7xx);

ret = a6xx_set_supported_hw(&pdev->dev, config->info);
ret = a6xx_set_supported_hw(&pdev->dev, a6xx_gpu, info);
if (ret) {
a6xx_llc_slices_destroy(a6xx_gpu);
kfree(a6xx_gpu);
return ERR_PTR(ret);
}

if ((enable_preemption == 1) || (enable_preemption == -1 &&
(config->info->quirks & ADRENO_QUIRK_PREEMPTION)))
(info->quirks & ADRENO_QUIRK_PREEMPTION)))
nr_rings = 4;

ret = adreno_gpu_init(dev, pdev, adreno_gpu, config->info->funcs, nr_rings);
ret = adreno_gpu_init(dev, pdev, adreno_gpu, info->funcs, nr_rings);
if (ret) {
a6xx_destroy(&(a6xx_gpu->base.base));
return ERR_PTR(ret);
}

/* Set the speedbin value that is passed to userspace */
if (a6xx_read_speedbin(&pdev->dev, a6xx_gpu, info, &speedbin) || !speedbin)
speedbin = 0xffff;
adreno_gpu->speedbin = (uint16_t) (0xffff & speedbin);

/*
* For now only clamp to idle freq for devices where this is known not
* to cause power supply issues:
Expand Down
5 changes: 0 additions & 5 deletions drivers/gpu/drm/msm/adreno/adreno_gpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1184,7 +1184,6 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
struct msm_gpu_config adreno_gpu_config = { 0 };
struct msm_gpu *gpu = &adreno_gpu->base;
const char *gpu_name;
u32 speedbin;
int ret;

adreno_gpu->funcs = funcs;
Expand Down Expand Up @@ -1213,10 +1212,6 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
devm_pm_opp_set_clkname(dev, "core");
}

if (adreno_read_speedbin(dev, &speedbin) || !speedbin)
speedbin = 0xffff;
adreno_gpu->speedbin = (uint16_t) (0xffff & speedbin);

gpu_name = devm_kasprintf(dev, GFP_KERNEL, "%"ADRENO_CHIPID_FMT,
ADRENO_CHIPID_ARGS(config->chip_id));
if (!gpu_name)
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/msm/adreno/adreno_gpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ enum adreno_family {
#define ADRENO_QUIRK_PREEMPTION BIT(5)
#define ADRENO_QUIRK_4GB_VA BIT(6)
#define ADRENO_QUIRK_IFPC BIT(7)
#define ADRENO_QUIRK_SOFTFUSE BIT(8)

/* Helper for formating the chip_id in the way that userspace tools like
* crashdec expect.
Expand Down
4 changes: 4 additions & 0 deletions drivers/gpu/drm/msm/registers/adreno/a6xx.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5016,6 +5016,10 @@ by a particular renderpass/blit.
<bitfield pos="1" name="LPAC" type="boolean"/>
<bitfield pos="2" name="RAYTRACING" type="boolean"/>
</reg32>
<reg32 offset="0x0405" name="CX_MISC_SW_FUSE_FREQ_LIMIT_STATUS" variants="A8XX-">
<bitfield high="8" low="0" name="FINALFREQLIMIT"/>
<bitfield pos="24" name="SOFTSKUDISABLED" type="boolean"/>
</reg32>
</domain>

</database>