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