mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
drivers: firmware: xilinx: Switch to new family code in zynqmp_pm_get_family_info()
Currently, the family code and subfamily code are derived from the PMC_TAP_IDCODE register. Versal, Versal NET share the same family code. Also some platforms share the same subfamily code, making it difficult to distinguish between platforms. Update zynqmp_pm_get_family_info() to use IDs derived from the compatible string instead of silicon ID codes derived from PMC_TAP_IDCODE register. Signed-off-by: Jay Buddhabhatti <jay.buddhabhatti@amd.com> Link: https://lore.kernel.org/r/20250701123851.1314531-4-jay.buddhabhatti@amd.com Signed-off-by: Michal Simek <michal.simek@amd.com>
This commit is contained in:
committed by
Michal Simek
parent
e66f4c35e3
commit
25e3ae0ce3
@@ -473,8 +473,6 @@ int zynqmp_pm_invoke_fn(u32 pm_api_id, u32 *ret_payload, u32 num_args, ...)
|
|||||||
|
|
||||||
static u32 pm_api_version;
|
static u32 pm_api_version;
|
||||||
static u32 pm_tz_version;
|
static u32 pm_tz_version;
|
||||||
static u32 pm_family_code;
|
|
||||||
static u32 pm_sub_family_code;
|
|
||||||
|
|
||||||
int zynqmp_pm_register_sgi(u32 sgi_num, u32 reset)
|
int zynqmp_pm_register_sgi(u32 sgi_num, u32 reset)
|
||||||
{
|
{
|
||||||
@@ -541,32 +539,18 @@ EXPORT_SYMBOL_GPL(zynqmp_pm_get_chipid);
|
|||||||
/**
|
/**
|
||||||
* zynqmp_pm_get_family_info() - Get family info of platform
|
* zynqmp_pm_get_family_info() - Get family info of platform
|
||||||
* @family: Returned family code value
|
* @family: Returned family code value
|
||||||
* @subfamily: Returned sub-family code value
|
|
||||||
*
|
*
|
||||||
* Return: Returns status, either success or error+reason
|
* Return: Returns status, either success or error+reason
|
||||||
*/
|
*/
|
||||||
int zynqmp_pm_get_family_info(u32 *family, u32 *subfamily)
|
int zynqmp_pm_get_family_info(u32 *family)
|
||||||
{
|
{
|
||||||
u32 ret_payload[PAYLOAD_ARG_CNT];
|
if (!active_platform_fw_data)
|
||||||
u32 idcode;
|
return -ENODEV;
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* Check is family or sub-family code already received */
|
if (!family)
|
||||||
if (pm_family_code && pm_sub_family_code) {
|
return -EINVAL;
|
||||||
*family = pm_family_code;
|
|
||||||
*subfamily = pm_sub_family_code;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = zynqmp_pm_invoke_fn(PM_GET_CHIPID, ret_payload, 0);
|
*family = active_platform_fw_data->family_code;
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
idcode = ret_payload[1];
|
|
||||||
pm_family_code = FIELD_GET(FAMILY_CODE_MASK, idcode);
|
|
||||||
pm_sub_family_code = FIELD_GET(SUB_FAMILY_CODE_MASK, idcode);
|
|
||||||
*family = pm_family_code;
|
|
||||||
*subfamily = pm_sub_family_code;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1247,8 +1231,13 @@ int zynqmp_pm_pinctrl_set_config(const u32 pin, const u32 param,
|
|||||||
u32 value)
|
u32 value)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
u32 pm_family_code;
|
||||||
|
|
||||||
if (pm_family_code == ZYNQMP_FAMILY_CODE &&
|
ret = zynqmp_pm_get_family_info(&pm_family_code);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (pm_family_code == PM_ZYNQMP_FAMILY_CODE &&
|
||||||
param == PM_PINCTRL_CONFIG_TRI_STATE) {
|
param == PM_PINCTRL_CONFIG_TRI_STATE) {
|
||||||
ret = zynqmp_pm_feature(PM_PINCTRL_CONFIG_PARAM_SET);
|
ret = zynqmp_pm_feature(PM_PINCTRL_CONFIG_PARAM_SET);
|
||||||
if (ret < PM_PINCTRL_PARAM_SET_VERSION) {
|
if (ret < PM_PINCTRL_PARAM_SET_VERSION) {
|
||||||
@@ -2055,6 +2044,7 @@ static int zynqmp_firmware_probe(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
struct zynqmp_devinfo *devinfo;
|
struct zynqmp_devinfo *devinfo;
|
||||||
|
u32 pm_family_code;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = get_set_conduit_method(dev->of_node);
|
ret = get_set_conduit_method(dev->of_node);
|
||||||
@@ -2098,8 +2088,8 @@ static int zynqmp_firmware_probe(struct platform_device *pdev)
|
|||||||
pr_info("%s Platform Management API v%d.%d\n", __func__,
|
pr_info("%s Platform Management API v%d.%d\n", __func__,
|
||||||
pm_api_version >> 16, pm_api_version & 0xFFFF);
|
pm_api_version >> 16, pm_api_version & 0xFFFF);
|
||||||
|
|
||||||
/* Get the Family code and sub family code of platform */
|
/* Get the Family code of platform */
|
||||||
ret = zynqmp_pm_get_family_info(&pm_family_code, &pm_sub_family_code);
|
ret = zynqmp_pm_get_family_info(&pm_family_code);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -2126,7 +2116,7 @@ static int zynqmp_firmware_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
zynqmp_pm_api_debugfs_init();
|
zynqmp_pm_api_debugfs_init();
|
||||||
|
|
||||||
if (pm_family_code == VERSAL_FAMILY_CODE) {
|
if (pm_family_code != PM_ZYNQMP_FAMILY_CODE) {
|
||||||
em_dev = platform_device_register_data(&pdev->dev, "xlnx_event_manager",
|
em_dev = platform_device_register_data(&pdev->dev, "xlnx_event_manager",
|
||||||
-1, NULL, 0);
|
-1, NULL, 0);
|
||||||
if (IS_ERR(em_dev))
|
if (IS_ERR(em_dev))
|
||||||
|
|||||||
@@ -100,7 +100,6 @@ struct zynqmp_pctrl_group {
|
|||||||
|
|
||||||
static struct pinctrl_desc zynqmp_desc;
|
static struct pinctrl_desc zynqmp_desc;
|
||||||
static u32 family_code;
|
static u32 family_code;
|
||||||
static u32 sub_family_code;
|
|
||||||
|
|
||||||
static int zynqmp_pctrl_get_groups_count(struct pinctrl_dev *pctldev)
|
static int zynqmp_pctrl_get_groups_count(struct pinctrl_dev *pctldev)
|
||||||
{
|
{
|
||||||
@@ -605,7 +604,7 @@ static int zynqmp_pinctrl_prepare_func_groups(struct device *dev, u32 fid,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
for (pin = 0; pin < groups[resp[i]].npins; pin++) {
|
for (pin = 0; pin < groups[resp[i]].npins; pin++) {
|
||||||
if (family_code == ZYNQMP_FAMILY_CODE)
|
if (family_code == PM_ZYNQMP_FAMILY_CODE)
|
||||||
__set_bit(groups[resp[i]].pins[pin], used_pins);
|
__set_bit(groups[resp[i]].pins[pin], used_pins);
|
||||||
else
|
else
|
||||||
__set_bit((u8)groups[resp[i]].pins[pin] - 1, used_pins);
|
__set_bit((u8)groups[resp[i]].pins[pin] - 1, used_pins);
|
||||||
@@ -958,11 +957,11 @@ static int zynqmp_pinctrl_probe(struct platform_device *pdev)
|
|||||||
if (!pctrl)
|
if (!pctrl)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
ret = zynqmp_pm_get_family_info(&family_code, &sub_family_code);
|
ret = zynqmp_pm_get_family_info(&family_code);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (family_code == ZYNQMP_FAMILY_CODE) {
|
if (family_code == PM_ZYNQMP_FAMILY_CODE) {
|
||||||
ret = zynqmp_pinctrl_prepare_pin_desc(&pdev->dev, &zynqmp_desc.pins,
|
ret = zynqmp_pinctrl_prepare_pin_desc(&pdev->dev, &zynqmp_desc.pins,
|
||||||
&zynqmp_desc.npins);
|
&zynqmp_desc.npins);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -77,17 +77,17 @@ struct registered_event_data {
|
|||||||
|
|
||||||
static bool xlnx_is_error_event(const u32 node_id)
|
static bool xlnx_is_error_event(const u32 node_id)
|
||||||
{
|
{
|
||||||
u32 pm_family_code, pm_sub_family_code;
|
u32 pm_family_code;
|
||||||
|
|
||||||
zynqmp_pm_get_family_info(&pm_family_code, &pm_sub_family_code);
|
zynqmp_pm_get_family_info(&pm_family_code);
|
||||||
|
|
||||||
if (pm_sub_family_code == VERSAL_SUB_FAMILY_CODE) {
|
if (pm_family_code == PM_VERSAL_FAMILY_CODE) {
|
||||||
if (node_id == VERSAL_EVENT_ERROR_PMC_ERR1 ||
|
if (node_id == VERSAL_EVENT_ERROR_PMC_ERR1 ||
|
||||||
node_id == VERSAL_EVENT_ERROR_PMC_ERR2 ||
|
node_id == VERSAL_EVENT_ERROR_PMC_ERR2 ||
|
||||||
node_id == VERSAL_EVENT_ERROR_PSM_ERR1 ||
|
node_id == VERSAL_EVENT_ERROR_PSM_ERR1 ||
|
||||||
node_id == VERSAL_EVENT_ERROR_PSM_ERR2)
|
node_id == VERSAL_EVENT_ERROR_PSM_ERR2)
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else if (pm_family_code == PM_VERSAL_NET_FAMILY_CODE) {
|
||||||
if (node_id == VERSAL_NET_EVENT_ERROR_PMC_ERR1 ||
|
if (node_id == VERSAL_NET_EVENT_ERROR_PMC_ERR1 ||
|
||||||
node_id == VERSAL_NET_EVENT_ERROR_PMC_ERR2 ||
|
node_id == VERSAL_NET_EVENT_ERROR_PMC_ERR2 ||
|
||||||
node_id == VERSAL_NET_EVENT_ERROR_PMC_ERR3 ||
|
node_id == VERSAL_NET_EVENT_ERROR_PMC_ERR3 ||
|
||||||
|
|||||||
@@ -285,7 +285,7 @@ static int register_event(struct device *dev, const enum pm_api_cb_id cb_type, c
|
|||||||
static int zynqmp_pm_probe(struct platform_device *pdev)
|
static int zynqmp_pm_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
int ret, irq;
|
int ret, irq;
|
||||||
u32 pm_api_version, pm_family_code, pm_sub_family_code, node_id;
|
u32 pm_api_version, pm_family_code, node_id;
|
||||||
struct mbox_client *client;
|
struct mbox_client *client;
|
||||||
|
|
||||||
ret = zynqmp_pm_get_api_version(&pm_api_version);
|
ret = zynqmp_pm_get_api_version(&pm_api_version);
|
||||||
@@ -315,14 +315,16 @@ static int zynqmp_pm_probe(struct platform_device *pdev)
|
|||||||
INIT_WORK(&zynqmp_pm_init_suspend_work->callback_work,
|
INIT_WORK(&zynqmp_pm_init_suspend_work->callback_work,
|
||||||
zynqmp_pm_init_suspend_work_fn);
|
zynqmp_pm_init_suspend_work_fn);
|
||||||
|
|
||||||
ret = zynqmp_pm_get_family_info(&pm_family_code, &pm_sub_family_code);
|
ret = zynqmp_pm_get_family_info(&pm_family_code);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (pm_sub_family_code == VERSALNET_SUB_FAMILY_CODE)
|
if (pm_family_code == PM_VERSAL_NET_FAMILY_CODE)
|
||||||
node_id = PM_DEV_ACPU_0_0;
|
node_id = PM_DEV_ACPU_0_0;
|
||||||
else
|
else if (pm_family_code == PM_VERSAL_FAMILY_CODE)
|
||||||
node_id = PM_DEV_ACPU_0;
|
node_id = PM_DEV_ACPU_0;
|
||||||
|
else
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
ret = register_event(&pdev->dev, PM_NOTIFY_CB, node_id, EVENT_SUBSYSTEM_RESTART,
|
ret = register_event(&pdev->dev, PM_NOTIFY_CB, node_id, EVENT_SUBSYSTEM_RESTART,
|
||||||
false, subsystem_restart_event_callback);
|
false, subsystem_restart_event_callback);
|
||||||
|
|||||||
@@ -51,22 +51,11 @@
|
|||||||
|
|
||||||
#define PM_PINCTRL_PARAM_SET_VERSION 2
|
#define PM_PINCTRL_PARAM_SET_VERSION 2
|
||||||
|
|
||||||
#define ZYNQMP_FAMILY_CODE 0x23
|
|
||||||
#define VERSAL_FAMILY_CODE 0x26
|
|
||||||
|
|
||||||
/* Family codes */
|
/* Family codes */
|
||||||
#define PM_ZYNQMP_FAMILY_CODE 0x1 /* ZynqMP family code */
|
#define PM_ZYNQMP_FAMILY_CODE 0x1 /* ZynqMP family code */
|
||||||
#define PM_VERSAL_FAMILY_CODE 0x2 /* Versal family code */
|
#define PM_VERSAL_FAMILY_CODE 0x2 /* Versal family code */
|
||||||
#define PM_VERSAL_NET_FAMILY_CODE 0x3 /* Versal NET family code */
|
#define PM_VERSAL_NET_FAMILY_CODE 0x3 /* Versal NET family code */
|
||||||
|
|
||||||
/* When all subfamily of platform need to support */
|
|
||||||
#define ALL_SUB_FAMILY_CODE 0x00
|
|
||||||
#define VERSAL_SUB_FAMILY_CODE 0x01
|
|
||||||
#define VERSALNET_SUB_FAMILY_CODE 0x03
|
|
||||||
|
|
||||||
#define FAMILY_CODE_MASK GENMASK(27, 21)
|
|
||||||
#define SUB_FAMILY_CODE_MASK GENMASK(20, 19)
|
|
||||||
|
|
||||||
#define API_ID_MASK GENMASK(7, 0)
|
#define API_ID_MASK GENMASK(7, 0)
|
||||||
#define MODULE_ID_MASK GENMASK(11, 8)
|
#define MODULE_ID_MASK GENMASK(11, 8)
|
||||||
#define PLM_MODULE_ID_MASK GENMASK(15, 8)
|
#define PLM_MODULE_ID_MASK GENMASK(15, 8)
|
||||||
@@ -570,7 +559,7 @@ int zynqmp_pm_invoke_fw_fn(u32 pm_api_id, u32 *ret_payload, u32 num_args, ...);
|
|||||||
#if IS_REACHABLE(CONFIG_ZYNQMP_FIRMWARE)
|
#if IS_REACHABLE(CONFIG_ZYNQMP_FIRMWARE)
|
||||||
int zynqmp_pm_get_api_version(u32 *version);
|
int zynqmp_pm_get_api_version(u32 *version);
|
||||||
int zynqmp_pm_get_chipid(u32 *idcode, u32 *version);
|
int zynqmp_pm_get_chipid(u32 *idcode, u32 *version);
|
||||||
int zynqmp_pm_get_family_info(u32 *family, u32 *subfamily);
|
int zynqmp_pm_get_family_info(u32 *family);
|
||||||
int zynqmp_pm_query_data(struct zynqmp_pm_query_data qdata, u32 *out);
|
int zynqmp_pm_query_data(struct zynqmp_pm_query_data qdata, u32 *out);
|
||||||
int zynqmp_pm_clock_enable(u32 clock_id);
|
int zynqmp_pm_clock_enable(u32 clock_id);
|
||||||
int zynqmp_pm_clock_disable(u32 clock_id);
|
int zynqmp_pm_clock_disable(u32 clock_id);
|
||||||
@@ -651,7 +640,7 @@ static inline int zynqmp_pm_get_chipid(u32 *idcode, u32 *version)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int zynqmp_pm_get_family_info(u32 *family, u32 *subfamily)
|
static inline int zynqmp_pm_get_family_info(u32 *family)
|
||||||
{
|
{
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user