Linux 4.16.11
[linux/fpc-iii.git] / drivers / char / ipmi / ipmi_si_platform.c
blobf4214870d726cc7da287cb72a72feefce9bc5320
1 /*
2 * ipmi_si_platform.c
4 * Handling for platform devices in IPMI (ACPI, OF, and things
5 * coming from the platform.
6 */
7 #include <linux/types.h>
8 #include <linux/module.h>
9 #include <linux/of_device.h>
10 #include <linux/of_platform.h>
11 #include <linux/of_address.h>
12 #include <linux/of_irq.h>
13 #include <linux/acpi.h>
14 #include "ipmi_si.h"
15 #include "ipmi_dmi.h"
17 #define PFX "ipmi_platform: "
19 static bool si_tryplatform = true;
20 #ifdef CONFIG_ACPI
21 static bool si_tryacpi = true;
22 #endif
23 #ifdef CONFIG_OF
24 static bool si_tryopenfirmware = true;
25 #endif
26 #ifdef CONFIG_DMI
27 static bool si_trydmi = true;
28 #else
29 static bool si_trydmi = false;
30 #endif
32 module_param_named(tryplatform, si_tryplatform, bool, 0);
33 MODULE_PARM_DESC(tryplatform, "Setting this to zero will disable the"
34 " default scan of the interfaces identified via platform"
35 " interfaces besides ACPI, OpenFirmware, and DMI");
36 #ifdef CONFIG_ACPI
37 module_param_named(tryacpi, si_tryacpi, bool, 0);
38 MODULE_PARM_DESC(tryacpi, "Setting this to zero will disable the"
39 " default scan of the interfaces identified via ACPI");
40 #endif
41 #ifdef CONFIG_OF
42 module_param_named(tryopenfirmware, si_tryopenfirmware, bool, 0);
43 MODULE_PARM_DESC(tryopenfirmware, "Setting this to zero will disable the"
44 " default scan of the interfaces identified via OpenFirmware");
45 #endif
46 #ifdef CONFIG_DMI
47 module_param_named(trydmi, si_trydmi, bool, 0);
48 MODULE_PARM_DESC(trydmi, "Setting this to zero will disable the"
49 " default scan of the interfaces identified via DMI");
50 #endif
52 #ifdef CONFIG_ACPI
55 * Once we get an ACPI failure, we don't try any more, because we go
56 * through the tables sequentially. Once we don't find a table, there
57 * are no more.
59 static int acpi_failure;
61 /* For GPE-type interrupts. */
62 static u32 ipmi_acpi_gpe(acpi_handle gpe_device,
63 u32 gpe_number, void *context)
65 struct si_sm_io *io = context;
67 ipmi_si_irq_handler(io->irq, io->irq_handler_data);
68 return ACPI_INTERRUPT_HANDLED;
71 static void acpi_gpe_irq_cleanup(struct si_sm_io *io)
73 if (!io->irq)
74 return;
76 ipmi_irq_start_cleanup(io);
77 acpi_remove_gpe_handler(NULL, io->irq, &ipmi_acpi_gpe);
80 static int acpi_gpe_irq_setup(struct si_sm_io *io)
82 acpi_status status;
84 if (!io->irq)
85 return 0;
87 status = acpi_install_gpe_handler(NULL,
88 io->irq,
89 ACPI_GPE_LEVEL_TRIGGERED,
90 &ipmi_acpi_gpe,
91 io);
92 if (status != AE_OK) {
93 dev_warn(io->dev,
94 "Unable to claim ACPI GPE %d, running polled\n",
95 io->irq);
96 io->irq = 0;
97 return -EINVAL;
98 } else {
99 io->irq_cleanup = acpi_gpe_irq_cleanup;
100 ipmi_irq_finish_setup(io);
101 dev_info(io->dev, "Using ACPI GPE %d\n", io->irq);
102 return 0;
107 * Defined at
108 * http://h21007.www2.hp.com/portal/download/files/unprot/hpspmi.pdf
110 struct SPMITable {
111 s8 Signature[4];
112 u32 Length;
113 u8 Revision;
114 u8 Checksum;
115 s8 OEMID[6];
116 s8 OEMTableID[8];
117 s8 OEMRevision[4];
118 s8 CreatorID[4];
119 s8 CreatorRevision[4];
120 u8 InterfaceType;
121 u8 IPMIlegacy;
122 s16 SpecificationRevision;
125 * Bit 0 - SCI interrupt supported
126 * Bit 1 - I/O APIC/SAPIC
128 u8 InterruptType;
131 * If bit 0 of InterruptType is set, then this is the SCI
132 * interrupt in the GPEx_STS register.
134 u8 GPE;
136 s16 Reserved;
139 * If bit 1 of InterruptType is set, then this is the I/O
140 * APIC/SAPIC interrupt.
142 u32 GlobalSystemInterrupt;
144 /* The actual register address. */
145 struct acpi_generic_address addr;
147 u8 UID[4];
149 s8 spmi_id[1]; /* A '\0' terminated array starts here. */
152 static int try_init_spmi(struct SPMITable *spmi)
154 struct si_sm_io io;
156 if (spmi->IPMIlegacy != 1) {
157 pr_info(PFX "Bad SPMI legacy %d\n", spmi->IPMIlegacy);
158 return -ENODEV;
161 memset(&io, 0, sizeof(io));
162 io.addr_source = SI_SPMI;
163 pr_info(PFX "probing via SPMI\n");
165 /* Figure out the interface type. */
166 switch (spmi->InterfaceType) {
167 case 1: /* KCS */
168 io.si_type = SI_KCS;
169 break;
170 case 2: /* SMIC */
171 io.si_type = SI_SMIC;
172 break;
173 case 3: /* BT */
174 io.si_type = SI_BT;
175 break;
176 case 4: /* SSIF, just ignore */
177 return -EIO;
178 default:
179 pr_info(PFX "Unknown ACPI/SPMI SI type %d\n",
180 spmi->InterfaceType);
181 return -EIO;
184 if (spmi->InterruptType & 1) {
185 /* We've got a GPE interrupt. */
186 io.irq = spmi->GPE;
187 io.irq_setup = acpi_gpe_irq_setup;
188 } else if (spmi->InterruptType & 2) {
189 /* We've got an APIC/SAPIC interrupt. */
190 io.irq = spmi->GlobalSystemInterrupt;
191 io.irq_setup = ipmi_std_irq_setup;
192 } else {
193 /* Use the default interrupt setting. */
194 io.irq = 0;
195 io.irq_setup = NULL;
198 if (spmi->addr.bit_width) {
199 /* A (hopefully) properly formed register bit width. */
200 io.regspacing = spmi->addr.bit_width / 8;
201 } else {
202 io.regspacing = DEFAULT_REGSPACING;
204 io.regsize = io.regspacing;
205 io.regshift = spmi->addr.bit_offset;
207 if (spmi->addr.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
208 io.addr_type = IPMI_MEM_ADDR_SPACE;
209 } else if (spmi->addr.space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
210 io.addr_type = IPMI_IO_ADDR_SPACE;
211 } else {
212 pr_warn(PFX "Unknown ACPI I/O Address type\n");
213 return -EIO;
215 io.addr_data = spmi->addr.address;
217 pr_info("ipmi_si: SPMI: %s %#lx regsize %d spacing %d irq %d\n",
218 (io.addr_type == IPMI_IO_ADDR_SPACE) ? "io" : "mem",
219 io.addr_data, io.regsize, io.regspacing, io.irq);
221 return ipmi_si_add_smi(&io);
224 static void spmi_find_bmc(void)
226 acpi_status status;
227 struct SPMITable *spmi;
228 int i;
230 if (acpi_disabled)
231 return;
233 if (acpi_failure)
234 return;
236 for (i = 0; ; i++) {
237 status = acpi_get_table(ACPI_SIG_SPMI, i+1,
238 (struct acpi_table_header **)&spmi);
239 if (status != AE_OK)
240 return;
242 try_init_spmi(spmi);
245 #endif
247 static struct resource *
248 ipmi_get_info_from_resources(struct platform_device *pdev,
249 struct si_sm_io *io)
251 struct resource *res, *res_second;
253 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
254 if (res) {
255 io->addr_type = IPMI_IO_ADDR_SPACE;
256 } else {
257 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
258 if (res)
259 io->addr_type = IPMI_MEM_ADDR_SPACE;
261 if (!res) {
262 dev_err(&pdev->dev, "no I/O or memory address\n");
263 return NULL;
265 io->addr_data = res->start;
267 io->regspacing = DEFAULT_REGSPACING;
268 res_second = platform_get_resource(pdev,
269 (io->addr_type == IPMI_IO_ADDR_SPACE) ?
270 IORESOURCE_IO : IORESOURCE_MEM,
272 if (res_second) {
273 if (res_second->start > io->addr_data)
274 io->regspacing = res_second->start - io->addr_data;
276 io->regsize = DEFAULT_REGSIZE;
277 io->regshift = 0;
279 return res;
282 static int platform_ipmi_probe(struct platform_device *pdev)
284 struct si_sm_io io;
285 u8 type, slave_addr, addr_source;
286 int rv;
288 rv = device_property_read_u8(&pdev->dev, "addr-source", &addr_source);
289 if (rv)
290 addr_source = SI_PLATFORM;
291 if (addr_source >= SI_LAST)
292 return -EINVAL;
294 if (addr_source == SI_SMBIOS) {
295 if (!si_trydmi)
296 return -ENODEV;
297 } else {
298 if (!si_tryplatform)
299 return -ENODEV;
302 rv = device_property_read_u8(&pdev->dev, "ipmi-type", &type);
303 if (rv)
304 return -ENODEV;
306 memset(&io, 0, sizeof(io));
307 io.addr_source = addr_source;
308 dev_info(&pdev->dev, PFX "probing via %s\n",
309 ipmi_addr_src_to_str(addr_source));
311 switch (type) {
312 case SI_KCS:
313 case SI_SMIC:
314 case SI_BT:
315 io.si_type = type;
316 break;
317 default:
318 dev_err(&pdev->dev, "ipmi-type property is invalid\n");
319 return -EINVAL;
322 if (!ipmi_get_info_from_resources(pdev, &io))
323 return -EINVAL;
325 rv = device_property_read_u8(&pdev->dev, "slave-addr", &slave_addr);
326 if (rv) {
327 dev_warn(&pdev->dev, "device has no slave-addr property\n");
328 io.slave_addr = 0x20;
329 } else {
330 io.slave_addr = slave_addr;
333 io.irq = platform_get_irq(pdev, 0);
334 if (io.irq > 0)
335 io.irq_setup = ipmi_std_irq_setup;
336 else
337 io.irq = 0;
339 io.dev = &pdev->dev;
341 pr_info("ipmi_si: SMBIOS: %s %#lx regsize %d spacing %d irq %d\n",
342 (io.addr_type == IPMI_IO_ADDR_SPACE) ? "io" : "mem",
343 io.addr_data, io.regsize, io.regspacing, io.irq);
345 ipmi_si_add_smi(&io);
347 return 0;
350 #ifdef CONFIG_OF
351 static const struct of_device_id of_ipmi_match[] = {
352 { .type = "ipmi", .compatible = "ipmi-kcs",
353 .data = (void *)(unsigned long) SI_KCS },
354 { .type = "ipmi", .compatible = "ipmi-smic",
355 .data = (void *)(unsigned long) SI_SMIC },
356 { .type = "ipmi", .compatible = "ipmi-bt",
357 .data = (void *)(unsigned long) SI_BT },
360 MODULE_DEVICE_TABLE(of, of_ipmi_match);
362 static int of_ipmi_probe(struct platform_device *pdev)
364 const struct of_device_id *match;
365 struct si_sm_io io;
366 struct resource resource;
367 const __be32 *regsize, *regspacing, *regshift;
368 struct device_node *np = pdev->dev.of_node;
369 int ret;
370 int proplen;
372 if (!si_tryopenfirmware)
373 return -ENODEV;
375 dev_info(&pdev->dev, "probing via device tree\n");
377 match = of_match_device(of_ipmi_match, &pdev->dev);
378 if (!match)
379 return -ENODEV;
381 if (!of_device_is_available(np))
382 return -EINVAL;
384 ret = of_address_to_resource(np, 0, &resource);
385 if (ret) {
386 dev_warn(&pdev->dev, PFX "invalid address from OF\n");
387 return ret;
390 regsize = of_get_property(np, "reg-size", &proplen);
391 if (regsize && proplen != 4) {
392 dev_warn(&pdev->dev, PFX "invalid regsize from OF\n");
393 return -EINVAL;
396 regspacing = of_get_property(np, "reg-spacing", &proplen);
397 if (regspacing && proplen != 4) {
398 dev_warn(&pdev->dev, PFX "invalid regspacing from OF\n");
399 return -EINVAL;
402 regshift = of_get_property(np, "reg-shift", &proplen);
403 if (regshift && proplen != 4) {
404 dev_warn(&pdev->dev, PFX "invalid regshift from OF\n");
405 return -EINVAL;
408 memset(&io, 0, sizeof(io));
409 io.si_type = (enum si_type) match->data;
410 io.addr_source = SI_DEVICETREE;
411 io.irq_setup = ipmi_std_irq_setup;
413 if (resource.flags & IORESOURCE_IO)
414 io.addr_type = IPMI_IO_ADDR_SPACE;
415 else
416 io.addr_type = IPMI_MEM_ADDR_SPACE;
418 io.addr_data = resource.start;
420 io.regsize = regsize ? be32_to_cpup(regsize) : DEFAULT_REGSIZE;
421 io.regspacing = regspacing ? be32_to_cpup(regspacing) : DEFAULT_REGSPACING;
422 io.regshift = regshift ? be32_to_cpup(regshift) : 0;
424 io.irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
425 io.dev = &pdev->dev;
427 dev_dbg(&pdev->dev, "addr 0x%lx regsize %d spacing %d irq %d\n",
428 io.addr_data, io.regsize, io.regspacing, io.irq);
430 return ipmi_si_add_smi(&io);
432 #else
433 #define of_ipmi_match NULL
434 static int of_ipmi_probe(struct platform_device *dev)
436 return -ENODEV;
438 #endif
440 #ifdef CONFIG_ACPI
441 static int find_slave_address(struct si_sm_io *io, int slave_addr)
443 #ifdef CONFIG_IPMI_DMI_DECODE
444 if (!slave_addr) {
445 u32 flags = IORESOURCE_IO;
447 if (io->addr_type == IPMI_MEM_ADDR_SPACE)
448 flags = IORESOURCE_MEM;
450 slave_addr = ipmi_dmi_get_slave_addr(io->si_type, flags,
451 io->addr_data);
453 #endif
455 return slave_addr;
458 static int acpi_ipmi_probe(struct platform_device *pdev)
460 struct si_sm_io io;
461 acpi_handle handle;
462 acpi_status status;
463 unsigned long long tmp;
464 struct resource *res;
465 int rv = -EINVAL;
467 if (!si_tryacpi)
468 return -ENODEV;
470 handle = ACPI_HANDLE(&pdev->dev);
471 if (!handle)
472 return -ENODEV;
474 memset(&io, 0, sizeof(io));
475 io.addr_source = SI_ACPI;
476 dev_info(&pdev->dev, PFX "probing via ACPI\n");
478 io.addr_info.acpi_info.acpi_handle = handle;
480 /* _IFT tells us the interface type: KCS, BT, etc */
481 status = acpi_evaluate_integer(handle, "_IFT", NULL, &tmp);
482 if (ACPI_FAILURE(status)) {
483 dev_err(&pdev->dev,
484 "Could not find ACPI IPMI interface type\n");
485 goto err_free;
488 switch (tmp) {
489 case 1:
490 io.si_type = SI_KCS;
491 break;
492 case 2:
493 io.si_type = SI_SMIC;
494 break;
495 case 3:
496 io.si_type = SI_BT;
497 break;
498 case 4: /* SSIF, just ignore */
499 rv = -ENODEV;
500 goto err_free;
501 default:
502 dev_info(&pdev->dev, "unknown IPMI type %lld\n", tmp);
503 goto err_free;
506 res = ipmi_get_info_from_resources(pdev, &io);
507 if (!res) {
508 rv = -EINVAL;
509 goto err_free;
512 /* If _GPE exists, use it; otherwise use standard interrupts */
513 status = acpi_evaluate_integer(handle, "_GPE", NULL, &tmp);
514 if (ACPI_SUCCESS(status)) {
515 io.irq = tmp;
516 io.irq_setup = acpi_gpe_irq_setup;
517 } else {
518 int irq = platform_get_irq(pdev, 0);
520 if (irq > 0) {
521 io.irq = irq;
522 io.irq_setup = ipmi_std_irq_setup;
526 io.slave_addr = find_slave_address(&io, io.slave_addr);
528 io.dev = &pdev->dev;
530 dev_info(io.dev, "%pR regsize %d spacing %d irq %d\n",
531 res, io.regsize, io.regspacing, io.irq);
533 return ipmi_si_add_smi(&io);
535 err_free:
536 return rv;
539 static const struct acpi_device_id acpi_ipmi_match[] = {
540 { "IPI0001", 0 },
541 { },
543 MODULE_DEVICE_TABLE(acpi, acpi_ipmi_match);
544 #else
545 static int acpi_ipmi_probe(struct platform_device *dev)
547 return -ENODEV;
549 #endif
551 static int ipmi_probe(struct platform_device *pdev)
553 if (pdev->dev.of_node && of_ipmi_probe(pdev) == 0)
554 return 0;
556 if (acpi_ipmi_probe(pdev) == 0)
557 return 0;
559 return platform_ipmi_probe(pdev);
562 static int ipmi_remove(struct platform_device *pdev)
564 return ipmi_si_remove_by_dev(&pdev->dev);
567 struct platform_driver ipmi_platform_driver = {
568 .driver = {
569 .name = DEVICE_NAME,
570 .of_match_table = of_ipmi_match,
571 .acpi_match_table = ACPI_PTR(acpi_ipmi_match),
573 .probe = ipmi_probe,
574 .remove = ipmi_remove,
577 void ipmi_si_platform_init(void)
579 int rv = platform_driver_register(&ipmi_platform_driver);
580 if (rv)
581 pr_err(PFX "Unable to register driver: %d\n", rv);
583 #ifdef CONFIG_ACPI
584 if (si_tryacpi)
585 spmi_find_bmc();
586 #endif
590 void ipmi_si_platform_shutdown(void)
592 platform_driver_unregister(&ipmi_platform_driver);