firmware.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*-
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2019 Ruslan Bukin <br@bsdpad.com>
  5. *
  6. * This software was developed by SRI International and the University of
  7. * Cambridge Computer Laboratory (Department of Computer Science and
  8. * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
  9. * DARPA SSITH research programme.
  10. *
  11. * Redistribution and use in source and binary forms, with or without
  12. * modification, are permitted provided that the following conditions
  13. * are met:
  14. * 1. Redistributions of source code must retain the above copyright
  15. * notice, this list of conditions and the following disclaimer.
  16. * 2. Redistributions in binary form must reproduce the above copyright
  17. * notice, this list of conditions and the following disclaimer in the
  18. * documentation and/or other materials provided with the distribution.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  21. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  24. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30. * SUCH DAMAGE.
  31. */
  32. #include <sys/cdefs.h>
  33. __FBSDID("$FreeBSD$");
  34. #include <sys/param.h>
  35. #include <sys/systm.h>
  36. #include <sys/kernel.h>
  37. #include <sys/module.h>
  38. #include <dev/fdt/simplebus.h>
  39. #include <dev/fdt/fdt_common.h>
  40. #include <dev/ofw/ofw_bus_subr.h>
  41. struct firmware_softc {
  42. struct simplebus_softc simplebus_sc;
  43. device_t dev;
  44. };
  45. static int
  46. firmware_probe(device_t dev)
  47. {
  48. phandle_t node;
  49. node = ofw_bus_get_node(dev);
  50. /*
  51. * The firmware node has no property compatible.
  52. * Look for a known child.
  53. */
  54. if (!fdt_depth_search_compatible(node, "intel,stratix10-svc", 0))
  55. return (ENXIO);
  56. if (!ofw_bus_status_okay(dev))
  57. return (ENXIO);
  58. device_set_desc(dev, "Firmware node");
  59. return (BUS_PROBE_DEFAULT);
  60. }
  61. static int
  62. firmware_attach(device_t dev)
  63. {
  64. struct firmware_softc *sc;
  65. phandle_t node;
  66. sc = device_get_softc(dev);
  67. sc->dev = dev;
  68. node = ofw_bus_get_node(dev);
  69. if (node == -1)
  70. return (ENXIO);
  71. simplebus_init(dev, node);
  72. /*
  73. * Allow devices to identify.
  74. */
  75. bus_generic_probe(dev);
  76. /*
  77. * Now walk the OFW tree and attach top-level devices.
  78. */
  79. for (node = OF_child(node); node > 0; node = OF_peer(node))
  80. simplebus_add_device(dev, node, 0, NULL, -1, NULL);
  81. return (bus_generic_attach(dev));
  82. }
  83. static int
  84. firmware_detach(device_t dev)
  85. {
  86. return (0);
  87. }
  88. static device_method_t firmware_methods[] = {
  89. DEVMETHOD(device_probe, firmware_probe),
  90. DEVMETHOD(device_attach, firmware_attach),
  91. DEVMETHOD(device_detach, firmware_detach),
  92. DEVMETHOD_END
  93. };
  94. DEFINE_CLASS_1(firmware, firmware_driver, firmware_methods,
  95. sizeof(struct firmware_softc), simplebus_driver);
  96. static devclass_t firmware_devclass;
  97. EARLY_DRIVER_MODULE(firmware, simplebus, firmware_driver, firmware_devclass,
  98. 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_MIDDLE);
  99. MODULE_VERSION(firmware, 1);