hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/drivers/char/ipmi/ipmi_dmi.c
....@@ -4,13 +4,16 @@
44 * allow autoloading of the IPMI drive based on SMBIOS entries.
55 */
66
7
+#define pr_fmt(fmt) "%s" fmt, "ipmi:dmi: "
8
+#define dev_fmt pr_fmt
9
+
710 #include <linux/ipmi.h>
811 #include <linux/init.h>
912 #include <linux/dmi.h>
1013 #include <linux/platform_device.h>
1114 #include <linux/property.h>
12
-#include "ipmi_si_sm.h"
1315 #include "ipmi_dmi.h"
16
+#include "ipmi_plat_data.h"
1417
1518 #define IPMI_DMI_TYPE_KCS 0x01
1619 #define IPMI_DMI_TYPE_SMIC 0x02
....@@ -19,7 +22,7 @@
1922
2023 struct ipmi_dmi_info {
2124 enum si_type si_type;
22
- u32 flags;
25
+ unsigned int space; /* addr space for si, intf# for ssif */
2326 unsigned long addr;
2427 u8 slave_addr;
2528 struct ipmi_dmi_info *next;
....@@ -30,141 +33,61 @@
3033 static int ipmi_dmi_nr __initdata;
3134
3235 static void __init dmi_add_platform_ipmi(unsigned long base_addr,
33
- u32 flags,
36
+ unsigned int space,
3437 u8 slave_addr,
3538 int irq,
3639 int offset,
3740 int type)
3841 {
39
- struct platform_device *pdev;
40
- struct resource r[4];
41
- unsigned int num_r = 1, size;
42
- struct property_entry p[5];
43
- unsigned int pidx = 0;
44
- char *name, *override;
45
- int rv;
46
- enum si_type si_type;
42
+ const char *name;
4743 struct ipmi_dmi_info *info;
44
+ struct ipmi_plat_data p;
4845
49
- memset(p, 0, sizeof(p));
46
+ memset(&p, 0, sizeof(p));
5047
5148 name = "dmi-ipmi-si";
52
- override = "ipmi_si";
49
+ p.iftype = IPMI_PLAT_IF_SI;
5350 switch (type) {
5451 case IPMI_DMI_TYPE_SSIF:
5552 name = "dmi-ipmi-ssif";
56
- override = "ipmi_ssif";
57
- offset = 1;
58
- size = 1;
59
- si_type = SI_TYPE_INVALID;
53
+ p.iftype = IPMI_PLAT_IF_SSIF;
54
+ p.type = SI_TYPE_INVALID;
6055 break;
6156 case IPMI_DMI_TYPE_BT:
62
- size = 3;
63
- si_type = SI_BT;
57
+ p.type = SI_BT;
6458 break;
6559 case IPMI_DMI_TYPE_KCS:
66
- size = 2;
67
- si_type = SI_KCS;
60
+ p.type = SI_KCS;
6861 break;
6962 case IPMI_DMI_TYPE_SMIC:
70
- size = 2;
71
- si_type = SI_SMIC;
63
+ p.type = SI_SMIC;
7264 break;
7365 default:
74
- pr_err("ipmi:dmi: Invalid IPMI type: %d\n", type);
66
+ pr_err("Invalid IPMI type: %d\n", type);
7567 return;
7668 }
7769
78
- if (si_type != SI_TYPE_INVALID)
79
- p[pidx++] = PROPERTY_ENTRY_U8("ipmi-type", si_type);
80
-
81
- p[pidx++] = PROPERTY_ENTRY_U8("slave-addr", slave_addr);
82
- p[pidx++] = PROPERTY_ENTRY_U8("addr-source", SI_SMBIOS);
70
+ p.addr = base_addr;
71
+ p.space = space;
72
+ p.regspacing = offset;
73
+ p.irq = irq;
74
+ p.slave_addr = slave_addr;
75
+ p.addr_source = SI_SMBIOS;
8376
8477 info = kmalloc(sizeof(*info), GFP_KERNEL);
8578 if (!info) {
86
- pr_warn("ipmi:dmi: Could not allocate dmi info\n");
79
+ pr_warn("Could not allocate dmi info\n");
8780 } else {
88
- info->si_type = si_type;
89
- info->flags = flags;
81
+ info->si_type = p.type;
82
+ info->space = space;
9083 info->addr = base_addr;
9184 info->slave_addr = slave_addr;
9285 info->next = ipmi_dmi_infos;
9386 ipmi_dmi_infos = info;
9487 }
9588
96
- pdev = platform_device_alloc(name, ipmi_dmi_nr);
97
- if (!pdev) {
98
- pr_err("ipmi:dmi: Error allocation IPMI platform device\n");
99
- return;
100
- }
101
- pdev->driver_override = kasprintf(GFP_KERNEL, "%s",
102
- override);
103
- if (!pdev->driver_override)
104
- goto err;
105
-
106
- if (type == IPMI_DMI_TYPE_SSIF) {
107
- p[pidx++] = PROPERTY_ENTRY_U16("i2c-addr", base_addr);
108
- goto add_properties;
109
- }
110
-
111
- memset(r, 0, sizeof(r));
112
-
113
- r[0].start = base_addr;
114
- r[0].end = r[0].start + offset - 1;
115
- r[0].name = "IPMI Address 1";
116
- r[0].flags = flags;
117
-
118
- if (size > 1) {
119
- r[1].start = r[0].start + offset;
120
- r[1].end = r[1].start + offset - 1;
121
- r[1].name = "IPMI Address 2";
122
- r[1].flags = flags;
123
- num_r++;
124
- }
125
-
126
- if (size > 2) {
127
- r[2].start = r[1].start + offset;
128
- r[2].end = r[2].start + offset - 1;
129
- r[2].name = "IPMI Address 3";
130
- r[2].flags = flags;
131
- num_r++;
132
- }
133
-
134
- if (irq) {
135
- r[num_r].start = irq;
136
- r[num_r].end = irq;
137
- r[num_r].name = "IPMI IRQ";
138
- r[num_r].flags = IORESOURCE_IRQ;
139
- num_r++;
140
- }
141
-
142
- rv = platform_device_add_resources(pdev, r, num_r);
143
- if (rv) {
144
- dev_err(&pdev->dev,
145
- "ipmi:dmi: Unable to add resources: %d\n", rv);
146
- goto err;
147
- }
148
-
149
-add_properties:
150
- rv = platform_device_add_properties(pdev, p);
151
- if (rv) {
152
- dev_err(&pdev->dev,
153
- "ipmi:dmi: Unable to add properties: %d\n", rv);
154
- goto err;
155
- }
156
-
157
- rv = platform_device_add(pdev);
158
- if (rv) {
159
- dev_err(&pdev->dev, "ipmi:dmi: Unable to add device: %d\n", rv);
160
- goto err;
161
- }
162
-
163
- ipmi_dmi_nr++;
164
- return;
165
-
166
-err:
167
- platform_device_put(pdev);
89
+ if (ipmi_platform_add(name, ipmi_dmi_nr, &p))
90
+ ipmi_dmi_nr++;
16891 }
16992
17093 /*
....@@ -174,14 +97,14 @@
17497 * This function allows an ACPI-specified IPMI device to look up the
17598 * slave address from the DMI table.
17699 */
177
-int ipmi_dmi_get_slave_addr(enum si_type si_type, u32 flags,
100
+int ipmi_dmi_get_slave_addr(enum si_type si_type, unsigned int space,
178101 unsigned long base_addr)
179102 {
180103 struct ipmi_dmi_info *info = ipmi_dmi_infos;
181104
182105 while (info) {
183106 if (info->si_type == si_type &&
184
- info->flags == flags &&
107
+ info->space == space &&
185108 info->addr == base_addr)
186109 return info->slave_addr;
187110 info = info->next;
....@@ -202,13 +125,13 @@
202125
203126 static void __init dmi_decode_ipmi(const struct dmi_header *dm)
204127 {
205
- const u8 *data = (const u8 *) dm;
206
- u32 flags = IORESOURCE_IO;
207
- unsigned long base_addr;
208
- u8 len = dm->length;
209
- u8 slave_addr;
210
- int irq = 0, offset;
211
- int type;
128
+ const u8 *data = (const u8 *) dm;
129
+ int space = IPMI_IO_ADDR_SPACE;
130
+ unsigned long base_addr;
131
+ u8 len = dm->length;
132
+ u8 slave_addr;
133
+ int irq = 0, offset = 0;
134
+ int type;
212135
213136 if (len < DMI_IPMI_MIN_LENGTH)
214137 return;
....@@ -223,8 +146,7 @@
223146 }
224147 if (len >= DMI_IPMI_VER2_LENGTH) {
225148 if (type == IPMI_DMI_TYPE_SSIF) {
226
- offset = 0;
227
- flags = 0;
149
+ space = 0; /* Match I2C interface 0. */
228150 base_addr = data[DMI_IPMI_ADDR] >> 1;
229151 if (base_addr == 0) {
230152 /*
....@@ -241,7 +163,7 @@
241163 base_addr &= DMI_IPMI_IO_MASK;
242164 } else {
243165 /* Memory */
244
- flags = IORESOURCE_MEM;
166
+ space = IPMI_MEM_ADDR_SPACE;
245167 }
246168
247169 /*
....@@ -267,7 +189,7 @@
267189 offset = 16;
268190 break;
269191 default:
270
- pr_err("ipmi:dmi: Invalid offset: 0\n");
192
+ pr_err("Invalid offset: 0\n");
271193 return;
272194 }
273195 }
....@@ -285,7 +207,7 @@
285207 offset = 1;
286208 }
287209
288
- dmi_add_platform_ipmi(base_addr, flags, slave_addr, irq,
210
+ dmi_add_platform_ipmi(base_addr, space, slave_addr, irq,
289211 offset, type);
290212 }
291213