]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drivers: firmware: xilinx: Switch to new family code in zynqmp_pm_get_family_info()
authorJay Buddhabhatti <jay.buddhabhatti@amd.com>
Tue, 1 Jul 2025 12:38:51 +0000 (05:38 -0700)
committerMichal Simek <michal.simek@amd.com>
Fri, 29 Aug 2025 07:58:45 +0000 (09:58 +0200)
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>
drivers/firmware/xilinx/zynqmp.c
drivers/pinctrl/pinctrl-zynqmp.c
drivers/soc/xilinx/xlnx_event_manager.c
drivers/soc/xilinx/zynqmp_power.c
include/linux/firmware/xlnx-zynqmp.h

index 2d250a16d3ddcbcd64ea52567fb4f101d9eceb7a..835a50c5af46c32ad916d003530910fc0fa2d039 100644 (file)
@@ -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_tz_version;
-static u32 pm_family_code;
-static u32 pm_sub_family_code;
 
 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
  * @family:    Returned family code value
- * @subfamily: Returned sub-family code value
  *
  * 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];
-       u32 idcode;
-       int ret;
-
-       /* Check is family or sub-family code already received */
-       if (pm_family_code && pm_sub_family_code) {
-               *family = pm_family_code;
-               *subfamily = pm_sub_family_code;
-               return 0;
-       }
+       if (!active_platform_fw_data)
+               return -ENODEV;
 
-       ret = zynqmp_pm_invoke_fn(PM_GET_CHIPID, ret_payload, 0);
-       if (ret < 0)
-               return ret;
+       if (!family)
+               return -EINVAL;
 
-       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;
+       *family = active_platform_fw_data->family_code;
 
        return 0;
 }
@@ -1247,8 +1231,13 @@ int zynqmp_pm_pinctrl_set_config(const u32 pin, const u32 param,
                                 u32 value)
 {
        int ret;
+       u32 pm_family_code;
+
+       ret = zynqmp_pm_get_family_info(&pm_family_code);
+       if (ret)
+               return ret;
 
-       if (pm_family_code == ZYNQMP_FAMILY_CODE &&
+       if (pm_family_code == PM_ZYNQMP_FAMILY_CODE &&
            param == PM_PINCTRL_CONFIG_TRI_STATE) {
                ret = zynqmp_pm_feature(PM_PINCTRL_CONFIG_PARAM_SET);
                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 zynqmp_devinfo *devinfo;
+       u32 pm_family_code;
        int ret;
 
        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__,
                pm_api_version >> 16, pm_api_version & 0xFFFF);
 
-       /* Get the Family code and sub family code of platform */
-       ret = zynqmp_pm_get_family_info(&pm_family_code, &pm_sub_family_code);
+       /* Get the Family code of platform */
+       ret = zynqmp_pm_get_family_info(&pm_family_code);
        if (ret < 0)
                return ret;
 
@@ -2126,7 +2116,7 @@ static int zynqmp_firmware_probe(struct platform_device *pdev)
 
        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",
                                                       -1, NULL, 0);
                if (IS_ERR(em_dev))
index fddf0fef4b13b8aba6a3bf83e082076deafaa4e2..71eaac81deb1e0828a824b183fab8686d6b89d21 100644 (file)
@@ -100,7 +100,6 @@ struct zynqmp_pctrl_group {
 
 static struct pinctrl_desc zynqmp_desc;
 static u32 family_code;
-static u32 sub_family_code;
 
 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;
 
                        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);
                                else
                                        __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)
                return -ENOMEM;
 
-       ret = zynqmp_pm_get_family_info(&family_code, &sub_family_code);
+       ret = zynqmp_pm_get_family_info(&family_code);
        if (ret < 0)
                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,
                                                      &zynqmp_desc.npins);
        } else {
index a572d15f616161396280360c96948aa0dfbb0a38..6fdf4d14b7e74712d475c104f81b759c1b03e6fe 100644 (file)
@@ -77,17 +77,17 @@ struct registered_event_data {
 
 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 ||
                    node_id == VERSAL_EVENT_ERROR_PMC_ERR2 ||
                    node_id == VERSAL_EVENT_ERROR_PSM_ERR1 ||
                    node_id == VERSAL_EVENT_ERROR_PSM_ERR2)
                        return true;
-       } else {
+       } else if (pm_family_code == PM_VERSAL_NET_FAMILY_CODE) {
                if (node_id == VERSAL_NET_EVENT_ERROR_PMC_ERR1 ||
                    node_id == VERSAL_NET_EVENT_ERROR_PMC_ERR2 ||
                    node_id == VERSAL_NET_EVENT_ERROR_PMC_ERR3 ||
index ae59bf16659a6833d20f14e9ef9d06db6a524b54..9b7b2858b22a5f65cc215de7b77a1876d0310b40 100644 (file)
@@ -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)
 {
        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;
 
        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,
                          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)
                        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;
-               else
+               else if (pm_family_code == PM_VERSAL_FAMILY_CODE)
                        node_id = PM_DEV_ACPU_0;
+               else
+                       return -ENODEV;
 
                ret = register_event(&pdev->dev, PM_NOTIFY_CB, node_id, EVENT_SUBSYSTEM_RESTART,
                                     false, subsystem_restart_event_callback);
index 6458ef4e04e29880ce2c98469c1feff7dfbfcd68..be6817ac5120513f204ad1cc553c21d33408aa4e 100644 (file)
 
 #define PM_PINCTRL_PARAM_SET_VERSION   2
 
-#define ZYNQMP_FAMILY_CODE 0x23
-#define VERSAL_FAMILY_CODE 0x26
-
 /* Family codes */
 #define PM_ZYNQMP_FAMILY_CODE 0x1 /* ZynqMP family code */
 #define PM_VERSAL_FAMILY_CODE 0x2 /* Versal 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 MODULE_ID_MASK         GENMASK(11, 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)
 int zynqmp_pm_get_api_version(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_clock_enable(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;
 }
 
-static inline int zynqmp_pm_get_family_info(u32 *family, u32 *subfamily)
+static inline int zynqmp_pm_get_family_info(u32 *family)
 {
        return -ENODEV;
 }