arm: mach-k3: Refactor QoS settings

Refactor common QoS code into a new common header file, and the soc
specific setup_qos functions into a common API.

Rename $(soc)_qos_count and $(soc)_qos_data variables to qos_count and
qos_data. When QoS settings of more SoCs are added, only one pair will
be defined at a time, based on the config SOC_K3_$(soc).

This refactoring has been done for 2 major purposes.

- The auto-generated $(soc)_qos_data.c and $(soc)_qos.h files cannot
  have any code that is specific to any bootloader. Those files have to
  remain agnostic of different bootloader implementations and their
  header files.

- The existing implementation was less than ideal and would have enabled
  multiple $(soc)_qos_count and $(soc)_qos_data variables for all SoC
  variants.

Signed-off-by: Aradhya Bhatia <a-bhatia1@ti.com>
This commit is contained in:
Aradhya Bhatia 2024-02-12 15:36:35 +05:30 committed by Tom Rini
parent 8fb8a6d499
commit 72703c7a0d
9 changed files with 56 additions and 28 deletions

View file

@ -69,20 +69,6 @@ static void ctrl_mmr_unlock(void)
mmr_unlock(PADCFG_MMR1_BASE, 1);
}
#if (IS_ENABLED(CONFIG_CPU_V7R))
static void setup_qos(void)
{
u32 i;
for (i = 0; i < am62a_qos_count; i++)
writel(am62a_qos_data[i].val, (uintptr_t)am62a_qos_data[i].reg);
}
#else
static void setup_qos(void)
{
}
#endif
void board_init_f(ulong dummy)
{
struct udevice *dev;

View file

@ -28,6 +28,8 @@
#include <elf.h>
#include <soc.h>
#include <asm/arch/k3-qos.h>
#if IS_ENABLED(CONFIG_SYS_K3_SPL_ATF)
enum {
IMAGE_ID_ATF,
@ -595,3 +597,13 @@ int misc_init_r(void)
void __weak do_board_detect(void)
{
}
#if (IS_ENABLED(CONFIG_K3_QOS))
void setup_qos(void)
{
u32 i;
for (i = 0; i < qos_count; i++)
writel(qos_data[i].val, (uintptr_t)qos_data[i].reg);
}
#endif

View file

@ -45,3 +45,11 @@ void ti_secure_image_post_process(void **p_image, size_t *p_size);
struct ti_sci_handle *get_ti_sci_handle(void);
void do_board_detect(void);
void ti_secure_image_check_binary(void **p_image, size_t *p_size);
#if (IS_ENABLED(CONFIG_K3_QOS))
void setup_qos(void);
#else
static inline void setup_qos(void)
{
}
#endif

View file

@ -30,7 +30,6 @@
#ifdef CONFIG_SOC_K3_AM62A7
#include "am62a_hardware.h"
#include "am62a_qos.h"
#endif
/* Assuming these addresses and definitions stay common across K3 devices */
@ -97,12 +96,4 @@ struct rom_extended_boot_data {
u32 num_components;
};
struct k3_qos_data {
u32 reg;
u32 val;
};
extern struct k3_qos_data am62a_qos_data[];
extern u32 am62a_qos_count;
#endif /* _ASM_ARCH_HARDWARE_H_ */

View file

@ -0,0 +1,22 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Quality of Service (QoS) Configuration Header File
*
* Copyright (C) 2024 Texas Instruments Incorporated - https://www.ti.com/
*/
#ifndef _K3_QOS_H_
#define _K3_QOS_H_
#include <linux/kernel.h>
struct k3_qos_data {
u32 reg;
u32 val;
};
#if (IS_ENABLED(CONFIG_K3_QOS))
extern struct k3_qos_data qos_data[];
extern u32 qos_count;
#endif
#endif /* _K3_QOS_H_ */

View file

@ -1,6 +1,14 @@
config K3_LOAD_SYSFW
bool
config K3_QOS
bool "Enable Quality of Service (QoS) Settings for TI K3 SoCs"
default y if SOC_K3_AM62A7
help
This option enables the R5 SPL to apply QoS settings for various
HW controllers inside the TI K3 SoCs. The files for QoS settings are
generated from Sysconfig and k3-resource-partitioning tools.
config K3_SYSFW_IMAGE_NAME
string "File name of SYSFW firmware and configuration blob"
depends on K3_LOAD_SYSFW

View file

@ -4,4 +4,4 @@
obj-y += clk-data.o
obj-y += dev-data.o
obj-y += am62a_qos_data.o
obj-y += am62a_qos_uboot.o

View file

@ -5,10 +5,11 @@
*
* Copyright (C) 2022 Texas Instruments Incorporated - https://www.ti.com/
*/
#include <asm/arch/hardware.h>
#include "common.h"
struct k3_qos_data am62a_qos_data[] = {
#include <asm/arch/k3-qos.h>
#include "am62a_qos.h"
struct k3_qos_data qos_data[] = {
/* modules_qosConfig0 - 1 endpoints, 4 channels */
{
.reg = K3_DSS_UL_MAIN_0_VBUSM_DMA + 0x100 + 0x4 * 0,
@ -43,4 +44,4 @@ struct k3_qos_data am62a_qos_data[] = {
},
};
uint32_t am62a_qos_count = sizeof(am62a_qos_data) / sizeof(am62a_qos_data[0]);
u32 qos_count = ARRAY_SIZE(qos_data);