Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 62d5c1cb authored by Shreyas K K's avatar Shreyas K K Committed by Gerrit - the friendly Code Review server
Browse files

drivers: qcom: Add LLCC driver for Direwolf platform



Add Last Level Cache Controller driver for Direwolf
platform.

Change-Id: I489d5053495653f66ecd788faa441434d2c209dd
Signed-off-by: default avatarShreyas K K <shrekk@codeaurora.org>
parent 0479f03a
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -248,6 +248,15 @@ config QCOM_LLCC_PERFMON
	  interface. sysfs interface is used to configure and dump the LLCC
	  performance events.

config QCOM_DIREWOLF_LLCC
	tristate "Qualcomm Technologies, Inc. Direwolf LLCC driver"
	depends on QCOM_LLCC
	help
	  Say y or m here to enable the LLCC driver for Direwolf platform.
	  This provides data required to configure LLCC so that clients
	  can start using the LLCC slices.
	  If unsure, say n.

config QCOM_MDT_LOADER
	tristate
	select QCOM_SCM
+1 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ obj-$(CONFIG_QCOM_YUPIK_LLCC) += llcc-yupik.o
obj-$(CONFIG_QCOM_SM8150_LLCC) += llcc-sm8150.o
obj-$(CONFIG_QCOM_SDMSHRIKE_LLCC) += llcc-sdmshrike.o
obj-$(CONFIG_QCOM_SM6150_LLCC) += llcc-sm6150.o
obj-$(CONFIG_QCOM_DIREWOLF_LLCC) += llcc-direwolf.o
obj-$(CONFIG_QCOM_MINIDUMP) += msm_minidump.o minidump_log.o
obj-$(CONFIG_QCOM_MEM_OFFLINE) += mem-offline.o
obj-$(CONFIG_QCOM_MEM_BUF) += mem-buf.o mem_buf_dma_buf.o
+94 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2021, The Linux Foundation. All rights reserved.
 *
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/soc/qcom/llcc-qcom.h>

/*
 * SCT entry contains of the following parameters
 * uid: Unique id for the client's use case
 * slice_id: llcc slice id for each client
 * max_cap: The maximum capacity of the cache slice provided in KB
 * priority: Priority of the client used to select victim line for replacement
 * fixed_size: Determine of the slice has a fixed capacity
 * bonus_ways: Bonus ways to be used by any slice, bonus way is used only if
 *             it't not a reserved way.
 * res_ways: Reserved ways for the cache slice, the reserved ways cannot be used
 *           by any other client than the one its assigned to.
 * cache_mode: Each slice operates as a cache, this controls the mode of the
 *             slice normal or TCM
 * probe_target_ways: Determines what ways to probe for access hit. When
 *                    configured to 1 only bonus and reserved ways are probed.
 *                    when configured to 0 all ways in llcc are probed.
 * dis_cap_alloc: Disable capacity based allocation for a client
 * write_scid_en: Bit enables write cache support for a given scid.
 * retain_on_pc: If this bit is set and client has maitained active vote
 *               then the ways assigned to this client are not flushed on power
 *               collapse.
 * activate_on_init: Activate the slice immidiately after the SCT is programmed
 */
#define SCT_ENTRY(uid, sid, mc, p, fs, bway, rway, cmod, ptw, dca, wse, rp, a) \
	{					\
		.usecase_id = uid,		\
		.slice_id = sid,		\
		.max_cap = mc,			\
		.priority = p,			\
		.fixed_size = fs,		\
		.bonus_ways = bway,		\
		.res_ways = rway,		\
		.cache_mode = cmod,		\
		.probe_target_ways = ptw,	\
		.dis_cap_alloc = dca,		\
		.write_scid_en = wse,		\
		.retain_on_pc = rp,		\
		.activate_on_init = a,		\
	}

static struct llcc_slice_config direwolf_data[] =  {
	SCT_ENTRY(LLCC_CPUSS,    1, 6144, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 1, 1),
	SCT_ENTRY(LLCC_VIDSC0,   2, 512, 3, 1, 0xFFF, 0x0, 0, 0, 0, 0, 1, 0),
	SCT_ENTRY(LLCC_AUDIO,    6, 1024, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 0, 0),
	SCT_ENTRY(LLCC_CMPT,     10, 6144, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 0, 0),
	SCT_ENTRY(LLCC_GPUHTW,   11, 1024, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 1, 0),
	SCT_ENTRY(LLCC_GPU,      12, 4608, 1, 0, 0xFFF, 0x0, 0, 0, 0, 1, 1, 0),
	SCT_ENTRY(LLCC_MMUHWT,   13, 1024, 1, 1, 0xFFF,  0x0, 0, 0, 0, 0, 0, 1),
	SCT_ENTRY(LLCC_DISP,     16, 6144, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 1, 0),
	SCT_ENTRY(LLCC_AUDHW,    22, 2048, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 1, 0),
	SCT_ENTRY(LLCC_DRE,      26, 1024, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 1, 0),
	SCT_ENTRY(LLCC_CVP,      28, 512, 3, 1, 0xFFF, 0x0, 0, 0, 0, 0, 1, 0),
	SCT_ENTRY(LLCC_APTCM,    30, 1024, 3, 1, 0x0,  0x1, 1, 0, 0, 0, 1, 0),
	SCT_ENTRY(LLCC_WRTCH,    31, 512, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 0, 1),
	SCT_ENTRY(LLCC_CVPFW,    17, 512, 1, 0, 0xFFF, 0x0, 0, 0, 0, 0, 1, 0),
	SCT_ENTRY(LLCC_CPUSS1,   3, 2048, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 1, 0),
	SCT_ENTRY(LLCC_CMPT1,    14, 6144, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 0, 0),
	SCT_ENTRY(LLCC_CPUHWT,   5, 512, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 0, 1),
};

static int direwolf_qcom_llcc_probe(struct platform_device *pdev)
{
	return qcom_llcc_probe(pdev, direwolf_data,
				 ARRAY_SIZE(direwolf_data));
}

static const struct of_device_id direwolf_qcom_llcc_of_match[] = {
	{ .compatible = "qcom,direwolf-llcc" },
	{ },
};

static struct platform_driver direwolf_qcom_llcc_driver = {
	.driver = {
		.name = "direwolf-llcc",
		.of_match_table = direwolf_qcom_llcc_of_match,
	},
	.probe = direwolf_qcom_llcc_probe,
};
module_platform_driver(direwolf_qcom_llcc_driver);

MODULE_DESCRIPTION("QCOM Direwolf LLCC driver");
MODULE_LICENSE("GPL v2");
+3 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
 *
 */

@@ -30,12 +30,14 @@
#define LLCC_NPU         23
#define LLCC_WLNHW       24
#define LLCC_PIMEM       25
#define LLCC_DRE         26
#define LLCC_CVP         28
#define LLCC_MDMVPE      29
#define LLCC_APTCM       30
#define LLCC_WRTCH       31
#define LLCC_CVPFW       32
#define LLCC_CPUSS1      33
#define LLCC_CMPT1       34
#define LLCC_CPUHWT      36
#define LLCC_MDMCLD2     37