From b22da3d8526a935aa31e086e63f60ff3246cb61c Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Sat, 09 Dec 2023 07:24:11 +0000
Subject: [PATCH] add stmac read mac form eeprom

---
 kernel/drivers/char/ipmi/ipmi_si_hardcode.c |  135 ++++++++------------------------------------
 1 files changed, 25 insertions(+), 110 deletions(-)

diff --git a/kernel/drivers/char/ipmi/ipmi_si_hardcode.c b/kernel/drivers/char/ipmi/ipmi_si_hardcode.c
index 0c28e87..f6ece75 100644
--- a/kernel/drivers/char/ipmi/ipmi_si_hardcode.c
+++ b/kernel/drivers/char/ipmi/ipmi_si_hardcode.c
@@ -1,10 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0+
 
+#define pr_fmt(fmt) "ipmi_hardcode: " fmt
+
 #include <linux/moduleparam.h>
 #include <linux/platform_device.h>
 #include "ipmi_si.h"
+#include "ipmi_plat_data.h"
 
-#define PFX "ipmi_hardcode: "
 /*
  * There can be 4 IO ports passed in (with or without IRQs), 4 addresses,
  * a default IO port, and 1 ACPI/SPMI address.  That sets SI_MAX_DRIVERS.
@@ -72,126 +74,43 @@
 		 " overridden by this parm.  This is an array indexed"
 		 " by interface number.");
 
-static struct platform_device *ipmi_hc_pdevs[SI_MAX_PARMS];
-
 static void __init ipmi_hardcode_init_one(const char *si_type_str,
 					  unsigned int i,
 					  unsigned long addr,
-					  unsigned int flags)
+					  enum ipmi_addr_space addr_space)
 {
-	struct platform_device *pdev;
-	unsigned int num_r = 1, size;
-	struct resource r[4];
-	struct property_entry p[6];
-	enum si_type si_type;
-	unsigned int regspacing, regsize;
-	int rv;
+	struct ipmi_plat_data p;
 
-	memset(p, 0, sizeof(p));
-	memset(r, 0, sizeof(r));
+	memset(&p, 0, sizeof(p));
 
+	p.iftype = IPMI_PLAT_IF_SI;
 	if (!si_type_str || !*si_type_str || strcmp(si_type_str, "kcs") == 0) {
-		size = 2;
-		si_type = SI_KCS;
+		p.type = SI_KCS;
 	} else if (strcmp(si_type_str, "smic") == 0) {
-		size = 2;
-		si_type = SI_SMIC;
+		p.type = SI_SMIC;
 	} else if (strcmp(si_type_str, "bt") == 0) {
-		size = 3;
-		si_type = SI_BT;
+		p.type = SI_BT;
 	} else if (strcmp(si_type_str, "invalid") == 0) {
 		/*
 		 * Allow a firmware-specified interface to be
 		 * disabled.
 		 */
-		size = 1;
-		si_type = SI_TYPE_INVALID;
+		p.type = SI_TYPE_INVALID;
 	} else {
 		pr_warn("Interface type specified for interface %d, was invalid: %s\n",
 			i, si_type_str);
 		return;
 	}
 
-	regsize = regsizes[i];
-	if (regsize == 0)
-		regsize = DEFAULT_REGSIZE;
+	p.regsize = regsizes[i];
+	p.slave_addr = slave_addrs[i];
+	p.addr_source = SI_HARDCODED;
+	p.regshift = regshifts[i];
+	p.regsize = regsizes[i];
+	p.addr = addr;
+	p.space = addr_space;
 
-	p[0] = PROPERTY_ENTRY_U8("ipmi-type", si_type);
-	p[1] = PROPERTY_ENTRY_U8("slave-addr", slave_addrs[i]);
-	p[2] = PROPERTY_ENTRY_U8("addr-source", SI_HARDCODED);
-	p[3] = PROPERTY_ENTRY_U8("reg-shift", regshifts[i]);
-	p[4] = PROPERTY_ENTRY_U8("reg-size", regsize);
-	/* Last entry must be left NULL to terminate it. */
-
-	/*
-	 * Register spacing is derived from the resources in
-	 * the IPMI platform code.
-	 */
-	regspacing = regspacings[i];
-	if (regspacing == 0)
-		regspacing = regsize;
-
-	r[0].start = addr;
-	r[0].end = r[0].start + regsize - 1;
-	r[0].name = "IPMI Address 1";
-	r[0].flags = flags;
-
-	if (size > 1) {
-		r[1].start = r[0].start + regspacing;
-		r[1].end = r[1].start + regsize - 1;
-		r[1].name = "IPMI Address 2";
-		r[1].flags = flags;
-		num_r++;
-	}
-
-	if (size > 2) {
-		r[2].start = r[1].start + regspacing;
-		r[2].end = r[2].start + regsize - 1;
-		r[2].name = "IPMI Address 3";
-		r[2].flags = flags;
-		num_r++;
-	}
-
-	if (irqs[i]) {
-		r[num_r].start = irqs[i];
-		r[num_r].end = irqs[i];
-		r[num_r].name = "IPMI IRQ";
-		r[num_r].flags = IORESOURCE_IRQ;
-		num_r++;
-	}
-
-	pdev = platform_device_alloc("hardcode-ipmi-si", i);
-	if (!pdev) {
-		pr_err("Error allocating IPMI platform device %d\n", i);
-		return;
-	}
-
-	rv = platform_device_add_resources(pdev, r, num_r);
-	if (rv) {
-		dev_err(&pdev->dev,
-			"Unable to add hard-code resources: %d\n", rv);
-		goto err;
-	}
-
-	rv = platform_device_add_properties(pdev, p);
-	if (rv) {
-		dev_err(&pdev->dev,
-			"Unable to add hard-code properties: %d\n", rv);
-		goto err;
-	}
-
-	rv = platform_device_add(pdev);
-	if (rv) {
-		dev_err(&pdev->dev,
-			"Unable to add hard-code device: %d\n", rv);
-		goto err;
-	}
-
-	ipmi_hc_pdevs[i] = pdev;
-	return;
-
-err:
-	platform_device_put(pdev);
+	ipmi_platform_add("hardcode-ipmi-si", i, &p);
 }
 
 void __init ipmi_hardcode_init(void)
@@ -220,32 +139,28 @@
 	for (i = 0; i < SI_MAX_PARMS; i++) {
 		if (i < num_ports && ports[i])
 			ipmi_hardcode_init_one(si_type[i], i, ports[i],
-					       IORESOURCE_IO);
+					       IPMI_IO_ADDR_SPACE);
 		if (i < num_addrs && addrs[i])
 			ipmi_hardcode_init_one(si_type[i], i, addrs[i],
-					       IORESOURCE_MEM);
+					       IPMI_MEM_ADDR_SPACE);
 	}
 }
 
+
 void ipmi_si_hardcode_exit(void)
 {
-	unsigned int i;
-
-	for (i = 0; i < SI_MAX_PARMS; i++) {
-		if (ipmi_hc_pdevs[i])
-			platform_device_unregister(ipmi_hc_pdevs[i]);
-	}
+	ipmi_remove_platform_device_by_name("hardcode-ipmi-si");
 }
 
 /*
  * Returns true of the given address exists as a hardcoded address,
  * false if not.
  */
-int ipmi_si_hardcode_match(int addr_type, unsigned long addr)
+int ipmi_si_hardcode_match(int addr_space, unsigned long addr)
 {
 	unsigned int i;
 
-	if (addr_type == IPMI_IO_ADDR_SPACE) {
+	if (addr_space == IPMI_IO_ADDR_SPACE) {
 		for (i = 0; i < num_ports; i++) {
 			if (ports[i] == addr)
 				return 1;

--
Gitblit v1.6.2