[PATCH 12/15] fsi: occ: Get device number from FSI minor number API

Eddie James posted 15 patches 2 months, 1 week ago
[PATCH 12/15] fsi: occ: Get device number from FSI minor number API
Posted by Eddie James 2 months, 1 week ago
Remove the IDA indexing for OCC devices and instead use the FSI
minor number API. This will make the OCC numbering consistent
with other FSI engines and make the "reg" device tree property
unnecessary.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
Reviewed-by: Ninad Palsule <ninad@linux.ibm.com>
---
 drivers/fsi/fsi-occ.c | 48 ++++++++++---------------------------------
 1 file changed, 11 insertions(+), 37 deletions(-)

diff --git a/drivers/fsi/fsi-occ.c b/drivers/fsi/fsi-occ.c
index f58b158d097c..11e090da0590 100644
--- a/drivers/fsi/fsi-occ.c
+++ b/drivers/fsi/fsi-occ.c
@@ -4,9 +4,9 @@
 #include <linux/err.h>
 #include <linux/errno.h>
 #include <linux/fs.h>
+#include <linux/fsi.h>
 #include <linux/fsi-sbefifo.h>
 #include <linux/gfp.h>
-#include <linux/idr.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
 #include <linux/miscdevice.h>
@@ -44,6 +44,7 @@ struct occ {
 	struct device *sbefifo;
 	char name[32];
 	int idx;
+	dev_t devt;
 	bool platform_hwmon;
 	u8 sequence_number;
 	void *buffer;
@@ -75,8 +76,6 @@ struct occ_client {
 
 #define to_client(x)	container_of((x), struct occ_client, xfr)
 
-static DEFINE_IDA(occ_ida);
-
 static int occ_open(struct inode *inode, struct file *file)
 {
 	struct occ_client *client = kzalloc(sizeof(*client), GFP_KERNEL);
@@ -622,7 +621,6 @@ static int occ_unregister_of_child(struct device *dev, void *data)
 static int occ_probe(struct platform_device *pdev)
 {
 	int rc;
-	u32 reg;
 	char child_name[32];
 	struct occ *occ;
 	struct platform_device *hwmon_dev = NULL;
@@ -637,6 +635,10 @@ static int occ_probe(struct platform_device *pdev)
 	if (!occ)
 		return -ENOMEM;
 
+	rc = fsi_get_new_minor(to_fsi_dev(dev->parent), fsi_dev_occ, &occ->devt, &occ->idx);
+	if (rc)
+		return rc;
+
 	/* SBE words are always four bytes */
 	occ->buffer = kvmalloc(OCC_MAX_RESP_WORDS * 4, GFP_KERNEL);
 	if (!occ->buffer)
@@ -651,23 +653,6 @@ static int occ_probe(struct platform_device *pdev)
 	 */
 	occ->sequence_number = (u8)((jiffies % 0xff) + 1);
 	mutex_init(&occ->occ_lock);
-
-	if (dev->of_node) {
-		rc = of_property_read_u32(dev->of_node, "reg", &reg);
-		if (!rc) {
-			/* make sure we don't have a duplicate from dts */
-			occ->idx = ida_alloc_range(&occ_ida, reg, reg,
-						   GFP_KERNEL);
-			if (occ->idx < 0)
-				occ->idx = ida_alloc_min(&occ_ida, 1,
-							 GFP_KERNEL);
-		} else {
-			occ->idx = ida_alloc_min(&occ_ida, 1, GFP_KERNEL);
-		}
-	} else {
-		occ->idx = ida_alloc_min(&occ_ida, 1, GFP_KERNEL);
-	}
-
 	platform_set_drvdata(pdev, occ);
 
 	snprintf(occ->name, sizeof(occ->name), "occ%d", occ->idx);
@@ -679,7 +664,7 @@ static int occ_probe(struct platform_device *pdev)
 	rc = misc_register(&occ->mdev);
 	if (rc) {
 		dev_err(dev, "failed to register miscdevice: %d\n", rc);
-		ida_free(&occ_ida, occ->idx);
+		fsi_free_minor(occ->devt);
 		kvfree(occ->buffer);
 		return rc;
 	}
@@ -718,7 +703,9 @@ static void occ_remove(struct platform_device *pdev)
 	else
 		device_for_each_child(&pdev->dev, NULL, occ_unregister_of_child);
 
-	ida_free(&occ_ida, occ->idx);
+	fsi_free_minor(occ->devt);
+
+	return 0;
 }
 
 static const struct of_device_id occ_match[] = {
@@ -743,20 +730,7 @@ static struct platform_driver occ_driver = {
 	.remove_new = occ_remove,
 };
 
-static int occ_init(void)
-{
-	return platform_driver_register(&occ_driver);
-}
-
-static void occ_exit(void)
-{
-	platform_driver_unregister(&occ_driver);
-
-	ida_destroy(&occ_ida);
-}
-
-module_init(occ_init);
-module_exit(occ_exit);
+module_platform_driver(occ_driver);
 
 MODULE_AUTHOR("Eddie James <eajames@linux.ibm.com>");
 MODULE_DESCRIPTION("BMC P9 OCC driver");
-- 
2.43.0
Re: [PATCH 12/15] fsi: occ: Get device number from FSI minor number API
Posted by kernel test robot 2 months, 1 week ago
Hi Eddie,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on v6.11 next-20240920]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Eddie-James/fsi-hub-Set-master-index-to-link-number-plus-one/20240918-012109
base:   linus/master
patch link:    https://lore.kernel.org/r/20240917171647.1403910-13-eajames%40linux.ibm.com
patch subject: [PATCH 12/15] fsi: occ: Get device number from FSI minor number API
config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20240921/202409210200.8czVX7S4-lkp@intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 8663a75fa2f31299ab8d1d90288d9df92aadee88)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240921/202409210200.8czVX7S4-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409210200.8czVX7S4-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In file included from drivers/fsi/fsi-occ.c:3:
   In file included from include/linux/device.h:32:
   In file included from include/linux/device/driver.h:21:
   In file included from include/linux/module.h:19:
   In file included from include/linux/elf.h:6:
   In file included from arch/s390/include/asm/elf.h:181:
   In file included from arch/s390/include/asm/mmu_context.h:11:
   In file included from arch/s390/include/asm/pgalloc.h:18:
   In file included from include/linux/mm.h:2237:
   include/linux/vmstat.h:503:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     503 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     504 |                            item];
         |                            ~~~~
   include/linux/vmstat.h:510:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     510 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     511 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:517:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     517 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   include/linux/vmstat.h:523:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     523 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     524 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
>> drivers/fsi/fsi-occ.c:708:2: warning: void function 'occ_remove' should not return a value [-Wreturn-mismatch]
     708 |         return 0;
         |         ^      ~
   5 warnings generated.


vim +/occ_remove +708 drivers/fsi/fsi-occ.c

   689	
   690	static void occ_remove(struct platform_device *pdev)
   691	{
   692		struct occ *occ = platform_get_drvdata(pdev);
   693	
   694		misc_deregister(&occ->mdev);
   695	
   696		mutex_lock(&occ->occ_lock);
   697		kvfree(occ->buffer);
   698		occ->buffer = NULL;
   699		mutex_unlock(&occ->occ_lock);
   700	
   701		if (occ->platform_hwmon)
   702			device_for_each_child(&pdev->dev, NULL, occ_unregister_platform_child);
   703		else
   704			device_for_each_child(&pdev->dev, NULL, occ_unregister_of_child);
   705	
   706		fsi_free_minor(occ->devt);
   707	
 > 708		return 0;
   709	}
   710	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Re: [PATCH 12/15] fsi: occ: Get device number from FSI minor number API
Posted by kernel test robot 2 months, 1 week ago
Hi Eddie,

kernel test robot noticed the following build errors:

[auto build test ERROR on linus/master]
[also build test ERROR on v6.11 next-20240920]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Eddie-James/fsi-hub-Set-master-index-to-link-number-plus-one/20240918-012109
base:   linus/master
patch link:    https://lore.kernel.org/r/20240917171647.1403910-13-eajames%40linux.ibm.com
patch subject: [PATCH 12/15] fsi: occ: Get device number from FSI minor number API
config: arm-randconfig-002-20240920 (https://download.01.org/0day-ci/archive/20240920/202409202101.tu2dHrK3-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240920/202409202101.tu2dHrK3-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409202101.tu2dHrK3-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/fsi/fsi-occ.c: In function 'occ_remove':
>> drivers/fsi/fsi-occ.c:708:16: error: 'return' with a value, in function returning void [-Wreturn-mismatch]
     708 |         return 0;
         |                ^
   drivers/fsi/fsi-occ.c:690:13: note: declared here
     690 | static void occ_remove(struct platform_device *pdev)
         |             ^~~~~~~~~~


vim +/return +708 drivers/fsi/fsi-occ.c

   689	
   690	static void occ_remove(struct platform_device *pdev)
   691	{
   692		struct occ *occ = platform_get_drvdata(pdev);
   693	
   694		misc_deregister(&occ->mdev);
   695	
   696		mutex_lock(&occ->occ_lock);
   697		kvfree(occ->buffer);
   698		occ->buffer = NULL;
   699		mutex_unlock(&occ->occ_lock);
   700	
   701		if (occ->platform_hwmon)
   702			device_for_each_child(&pdev->dev, NULL, occ_unregister_platform_child);
   703		else
   704			device_for_each_child(&pdev->dev, NULL, occ_unregister_of_child);
   705	
   706		fsi_free_minor(occ->devt);
   707	
 > 708		return 0;
   709	}
   710	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Re: [PATCH 12/15] fsi: occ: Get device number from FSI minor number API
Posted by kernel test robot 2 months, 1 week ago
Hi Eddie,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on v6.11 next-20240920]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Eddie-James/fsi-hub-Set-master-index-to-link-number-plus-one/20240918-012109
base:   linus/master
patch link:    https://lore.kernel.org/r/20240917171647.1403910-13-eajames%40linux.ibm.com
patch subject: [PATCH 12/15] fsi: occ: Get device number from FSI minor number API
config: arc-randconfig-002-20240920 (https://download.01.org/0day-ci/archive/20240920/202409201954.IYcZNCSj-lkp@intel.com/config)
compiler: arc-elf-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240920/202409201954.IYcZNCSj-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409201954.IYcZNCSj-lkp@intel.com/

All warnings (new ones prefixed by >>):

   drivers/fsi/fsi-occ.c: In function 'occ_remove':
>> drivers/fsi/fsi-occ.c:708:16: warning: 'return' with a value, in function returning void [-Wreturn-type]
     708 |         return 0;
         |                ^
   drivers/fsi/fsi-occ.c:690:13: note: declared here
     690 | static void occ_remove(struct platform_device *pdev)
         |             ^~~~~~~~~~


vim +/return +708 drivers/fsi/fsi-occ.c

   689	
   690	static void occ_remove(struct platform_device *pdev)
   691	{
   692		struct occ *occ = platform_get_drvdata(pdev);
   693	
   694		misc_deregister(&occ->mdev);
   695	
   696		mutex_lock(&occ->occ_lock);
   697		kvfree(occ->buffer);
   698		occ->buffer = NULL;
   699		mutex_unlock(&occ->occ_lock);
   700	
   701		if (occ->platform_hwmon)
   702			device_for_each_child(&pdev->dev, NULL, occ_unregister_platform_child);
   703		else
   704			device_for_each_child(&pdev->dev, NULL, occ_unregister_of_child);
   705	
   706		fsi_free_minor(occ->devt);
   707	
 > 708		return 0;
   709	}
   710	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki