[PATCH linux v1 2/3] drivers: misc: Character driver to update BMC post code

Rick Altherr raltherr at google.com
Thu Oct 13 12:15:56 AEDT 2016


On Wed, Oct 12, 2016 at 5:41 PM, Jaghathiswari Rankappagounder Natarajan <
jaghu at google.com> wrote:

> Character driver - On state change, the BMC will write its POST code to the
> character device. The POST code is then sent to update-postcard platform
> driver for display on the POST card. The BMC POST code consists of 3 digits
>
> Signed-off-by: Jaghathiswari Rankappagounder Natarajan <jaghu at google.com>
> ---
>  drivers/misc/Kconfig               |   8 +++
>  drivers/misc/Makefile              |   1 +
>  drivers/misc/update-bmc-postcode.c | 123 ++++++++++++++++++++++++++++++
> +++++++
>  3 files changed, 132 insertions(+)
>  create mode 100644 drivers/misc/update-bmc-postcode.c
>
> diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
> index d65b83f..69dc3b6 100644
> --- a/drivers/misc/Kconfig
> +++ b/drivers/misc/Kconfig
> @@ -815,6 +815,14 @@ config ASPEED_BT_IPMI_HOST
>         help
>           Support for the Aspeed BT ipmi host.
>
> +config ASPEED_UPDATE_BMC_POSTCODE
> +       tristate "Character driver for BMC POST code update"
> +       depends on ASPEED_UPDATE_POSTCARD
> +       help
> +        On state change, the BMC will write its POST code to the
> +        character device. The POST code is then sent to update-postcard
> platform
> +        driver for display on the POST card
> +
>

Again, not specific to Aspeed.  Maybe this should be SEVEN_SEGMENT_DISPLAY
and the other driver should be SEVEN_SEGMENT_SGPIO.


>  source "drivers/misc/c2port/Kconfig"
>  source "drivers/misc/eeprom/Kconfig"
>  source "drivers/misc/cb710/Kconfig"
> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
> index 730c6c2..dce20cb 100644
> --- a/drivers/misc/Makefile
> +++ b/drivers/misc/Makefile
> @@ -59,3 +59,4 @@ obj-$(CONFIG_CXL_BASE)                += cxl/
>  obj-$(CONFIG_PANEL)             += panel.o
>  obj-$(CONFIG_ASPEED_UPDATE_POSTCARD)    += update-postcard.o
>  obj-$(CONFIG_ASPEED_BT_IPMI_HOST)      += bt-host.o
> +obj-$(CONFIG_ASPEED_UPDATE_BMC_POSTCODE)       += update-bmc-postcode.o
> diff --git a/drivers/misc/update-bmc-postcode.c b/drivers/misc/update-bmc-
> postcode.c
> new file mode 100644
> index 0000000..8e368a4
> --- /dev/null
> +++ b/drivers/misc/update-bmc-postcode.c
> @@ -0,0 +1,123 @@
> +/*
> + * Character driver - On state change, the BMC will write its POST code
> to the
> + * character device. The POST code is then sent to update-postcard
> platform
> + * driver for display on the POST card. The BMC POST code consists of 3
> digits.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/version.h>
> +#include <linux/kernel.h>
> +#include <linux/types.h>
> +#include <linux/kdev_t.h>
> +#include <linux/fs.h>
> +#include <linux/device.h>
> +#include <linux/cdev.h>
> +#include <linux/uaccess.h>
> +#include <linux/ctype.h>
> +
> +#include "update-postcard.h"
> +
> +#define MAX_POSTCODE_SIZE 3
> +
> +static dev_t bmc_state_dev;
> +static struct cdev c_dev;
> +static struct class *bmc_state_class;
> +
> +static int bmc_state_open(struct inode *i, struct file *f)
> +{
> +       return 0;
> +}
> +
> +static int bmc_state_close(struct inode *i, struct file *f)
> +{
> +       return 0;
> +}
> +
> +static ssize_t bmc_state_read(struct file *f, char __user *buf, size_t
> +                               len, loff_t *off)
> +{
> +       return 0;
> +}
> +
> +/* Write post code from bmc to the correct variable */
> +static ssize_t bmc_state_write(struct file *f, const char __user *buf,
> +                               size_t len, loff_t *off)
> +{
> +       char tmp[MAX_POSTCODE_SIZE];
> +       int length = len - 1;
> +       int i;
> +
> +       if (length != MAX_POSTCODE_SIZE) {
> +               return -EINVAL;
> +       }
> +
> +       if (copy_from_user(tmp, buf, length) != 0) {
> +               return -EFAULT;
> +       }
> +
> +       for (i = 0; i < MAX_POSTCODE_SIZE; i++) {
> +               if (!isxdigit(tmp[i]))
> +                       return -EINVAL;
> +       }
> +
> +       update_postcode(tmp);
>

As written, this is hard-coded to the bit-bang driver in your other patch.
The concept is fairly generic though.  If we switched to using a 74HC165
that is compatible with the Aspeed's built-in SGPIO hardware, ideally we'd
only need to write a driver for the SGPIO.  That implies you want this
character device to attach to any compatible display drivers.


> +       return len;
> +}
> +
> +static const struct file_operations bmc_state_fops = {
> +
> +       .owner = THIS_MODULE,
> +       .open = bmc_state_open,
> +       .release = bmc_state_close,
> +       .read = bmc_state_read,
> +       .write = bmc_state_write
> +};
> +
> +static int __init update_bmc_pc_init(void)
> +{
> +       if (alloc_chrdev_region(&bmc_state_dev, 0, 1, "bmc_state") < 0) {
> +               return -1;
> +       }
> +
> +       bmc_state_class = class_create(THIS_MODULE, "bmc_state");
> +       if (bmc_state_class == NULL) {
> +               goto unregister;
> +               return -1;
> +       }
> +
> +       if (device_create(bmc_state_class, NULL, bmc_state_dev,
> +               NULL, "current_state") == NULL) {
> +               goto class_destroy;
> +               return -1;
> +       }
> +
> +       cdev_init(&c_dev, &bmc_state_fops);
> +       if (cdev_add(&c_dev, bmc_state_dev, 1) == -1) {
> +               goto device_destroy;
> +               return -1;
> +       }
> +
> +       return 0;
> +
> +device_destroy:
> +               device_destroy(bmc_state_class, bmc_state_dev);
> +class_destroy:
> +               class_destroy(bmc_state_class);
> +unregister:
> +               unregister_chrdev_region(bmc_state_dev, 1);
> +       return -1;
> +}
> +
> +static void __exit update_bmc_pc_exit(void)
> +{
> +       cdev_del(&c_dev);
> +       device_destroy(bmc_state_class, bmc_state_dev);
> +       class_destroy(bmc_state_class);
> +       unregister_chrdev_region(bmc_state_dev, 1);
> +}
> +
> +module_init(update_bmc_pc_init);
> +module_exit(update_bmc_pc_exit);
> +MODULE_LICENSE("GPL");
> +MODULE_AUTHOR("Jaghathiswari Rankappagounder Natarajan <jaghu at google.com
> >");
> +MODULE_DESCRIPTION("Character driver - update bmc postcode");
> --
> 2.8.0.rc3.226.g39d4020
>
> _______________________________________________
> openbmc mailing list
> openbmc at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/openbmc
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/openbmc/attachments/20161012/82f89832/attachment.html>


More information about the openbmc mailing list