// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (c) 2018 MediaTek Inc.
 * Author: Sirui Zhao <Sirui.Zhao@mediatek.com>
 */

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <net/genetlink.h>

#include "mt753x.h"
#include "mt753x_nl.h"

struct mt753x_nl_cmd_item {
	enum mt753x_cmd cmd;
	bool require_dev;
	int (*process)(struct genl_info *info, struct gsw_mt753x *gsw);
	u32 nr_required_attrs;
	const enum mt753x_attr *required_attrs;
};

static int mt753x_nl_response(struct sk_buff *skb, struct genl_info *info);

static const struct nla_policy mt753x_nl_cmd_policy[] = {
	[MT753X_ATTR_TYPE_MESG] = { .type = NLA_STRING },
	[MT753X_ATTR_TYPE_PHY] = { .type = NLA_S32 },
	[MT753X_ATTR_TYPE_REG] = { .type = NLA_S32 },
	[MT753X_ATTR_TYPE_VAL] = { .type = NLA_S32 },
	[MT753X_ATTR_TYPE_DEV_NAME] = { .type = NLA_S32 },
	[MT753X_ATTR_TYPE_DEV_ID] = { .type = NLA_S32 },
	[MT753X_ATTR_TYPE_DEVAD] = { .type = NLA_S32 },
};

static const struct genl_ops mt753x_nl_ops[] = {
	{
		.cmd = MT753X_CMD_REQUEST,
		.doit = mt753x_nl_response,
//		.policy = mt753x_nl_cmd_policy,
		.flags = GENL_ADMIN_PERM,
	}, {
		.cmd = MT753X_CMD_READ,
		.doit = mt753x_nl_response,
//		.policy = mt753x_nl_cmd_policy,
		.flags = GENL_ADMIN_PERM,
	}, {
		.cmd = MT753X_CMD_WRITE,
		.doit = mt753x_nl_response,
//		.policy = mt753x_nl_cmd_policy,
		.flags = GENL_ADMIN_PERM,
	},
};

static struct genl_family mt753x_nl_family = {
	.name =		MT753X_GENL_NAME,
	.version =	MT753X_GENL_VERSION,
	.maxattr =	MT753X_NR_ATTR_TYPE,
	.ops =		mt753x_nl_ops,
	.n_ops =	ARRAY_SIZE(mt753x_nl_ops),
	.policy =	mt753x_nl_cmd_policy,
};

static int mt753x_nl_list_devs(char *buff, int size)
{
	struct gsw_mt753x *gsw;
	int len, total = 0;
	char buf[80];

	memset(buff, 0, size);

	mt753x_lock_gsw();

	list_for_each_entry(gsw, &mt753x_devs, list) {
		len = snprintf(buf, sizeof(buf),
			       "id: %d, model: %s, node: %s\n",
			       gsw->id, gsw->name, gsw->dev->of_node->name);
		if (len == strlen(buf)) {
			strncat(buff, buf, size - total);
			total += len;
		}
	}

	mt753x_put_gsw();

	return total;
}

static int mt753x_nl_prepare_reply(struct genl_info *info, u8 cmd,
				   struct sk_buff **skbp)
{
	struct sk_buff *msg;
	void *reply;

	if (!info)
		return -EINVAL;

	msg = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
	if (!msg)
		return -ENOMEM;

	/* Construct send-back message header */
	reply = genlmsg_put(msg, info->snd_portid, info->snd_seq,
			    &mt753x_nl_family, 0, cmd);
	if (!reply) {
		nlmsg_free(msg);
		return -EINVAL;
	}

	*skbp = msg;
	return 0;
}

static int mt753x_nl_send_reply(struct sk_buff *skb, struct genl_info *info)
{
	struct genlmsghdr *genlhdr = nlmsg_data(nlmsg_hdr(skb));
	void *reply = genlmsg_data(genlhdr);

	/* Finalize a generic netlink message (update message header) */
	genlmsg_end(skb, reply);

	/* reply to a request */
	return genlmsg_reply(skb, info);
}

static s32 mt753x_nl_get_s32(struct genl_info *info, enum mt753x_attr attr,
			     s32 defval)
{
	struct nlattr *na;

	na = info->attrs[attr];
	if (na)
		return nla_get_s32(na);

	return defval;
}

static int mt753x_nl_get_u32(struct genl_info *info, enum mt753x_attr attr,
			     u32 *val)
{
	struct nlattr *na;

	na = info->attrs[attr];
	if (na) {
		*val = nla_get_u32(na);
		return 0;
	}

	return -1;
}

static struct gsw_mt753x *mt753x_nl_parse_find_gsw(struct genl_info *info)
{
	struct gsw_mt753x *gsw;
	struct nlattr *na;
	int gsw_id;

	na = info->attrs[MT753X_ATTR_TYPE_DEV_ID];
	if (na) {
		gsw_id = nla_get_s32(na);
		if (gsw_id >= 0)
			gsw = mt753x_get_gsw(gsw_id);
		else
			gsw = mt753x_get_first_gsw();
	} else {
		gsw = mt753x_get_first_gsw();
	}

	return gsw;
}

static int mt753x_nl_get_swdevs(struct genl_info *info, struct gsw_mt753x *gsw)
{
	struct sk_buff *rep_skb = NULL;
	char dev_info[512];
	int ret;

	ret = mt753x_nl_list_devs(dev_info, sizeof(dev_info));
	if (!ret) {
		pr_info("No switch registered\n");
		return -EINVAL;
	}

	ret = mt753x_nl_prepare_reply(info, MT753X_CMD_REPLY, &rep_skb);
	if (ret < 0)
		goto err;

	ret = nla_put_string(rep_skb, MT753X_ATTR_TYPE_MESG, dev_info);
	if (ret < 0)
		goto err;

	return mt753x_nl_send_reply(rep_skb, info);

err:
	if (rep_skb)
		nlmsg_free(rep_skb);

	return ret;
}

static int mt753x_nl_reply_read(struct genl_info *info, struct gsw_mt753x *gsw)
{
	struct sk_buff *rep_skb = NULL;
	s32 phy, devad, reg;
	int value;
	int ret = 0;

	phy = mt753x_nl_get_s32(info, MT753X_ATTR_TYPE_PHY, -1);
	devad = mt753x_nl_get_s32(info, MT753X_ATTR_TYPE_DEVAD, -1);
	reg = mt753x_nl_get_s32(info, MT753X_ATTR_TYPE_REG, -1);

	if (reg < 0)
		goto err;

	ret = mt753x_nl_prepare_reply(info, MT753X_CMD_READ, &rep_skb);
	if (ret < 0)
		goto err;

	if (phy >= 0) {
		if (devad < 0)
			value = gsw->mii_read(gsw, phy, reg);
		else
			value = gsw->mmd_read(gsw, phy, devad, reg);
	} else {
		value = mt753x_reg_read(gsw, reg);
	}

	ret = nla_put_s32(rep_skb, MT753X_ATTR_TYPE_REG, reg);
	if (ret < 0)
		goto err;

	ret = nla_put_s32(rep_skb, MT753X_ATTR_TYPE_VAL, value);
	if (ret < 0)
		goto err;

	return mt753x_nl_send_reply(rep_skb, info);

err:
	if (rep_skb)
		nlmsg_free(rep_skb);

	return ret;
}

static int mt753x_nl_reply_write(struct genl_info *info, struct gsw_mt753x *gsw)
{
	struct sk_buff *rep_skb = NULL;
	s32 phy, devad, reg;
	u32 value;
	int ret = 0;

	phy = mt753x_nl_get_s32(info, MT753X_ATTR_TYPE_PHY, -1);
	devad = mt753x_nl_get_s32(info, MT753X_ATTR_TYPE_DEVAD, -1);
	reg = mt753x_nl_get_s32(info, MT753X_ATTR_TYPE_REG, -1);

	if (mt753x_nl_get_u32(info, MT753X_ATTR_TYPE_VAL, &value))
		goto err;

	if (reg < 0)
		goto err;

	ret = mt753x_nl_prepare_reply(info, MT753X_CMD_WRITE, &rep_skb);
	if (ret < 0)
		goto err;

	if (phy >= 0) {
		if (devad < 0)
			gsw->mii_write(gsw, phy, reg, value);
		else
			gsw->mmd_write(gsw, phy, devad, reg, value);
	} else {
		mt753x_reg_write(gsw, reg, value);
	}

	ret = nla_put_s32(rep_skb, MT753X_ATTR_TYPE_REG, reg);
	if (ret < 0)
		goto err;

	ret = nla_put_s32(rep_skb, MT753X_ATTR_TYPE_VAL, value);
	if (ret < 0)
		goto err;

	return mt753x_nl_send_reply(rep_skb, info);

err:
	if (rep_skb)
		nlmsg_free(rep_skb);

	return ret;
}

static const enum mt753x_attr mt753x_nl_cmd_read_attrs[] = {
	MT753X_ATTR_TYPE_REG
};

static const enum mt753x_attr mt753x_nl_cmd_write_attrs[] = {
	MT753X_ATTR_TYPE_REG,
	MT753X_ATTR_TYPE_VAL
};

static const struct mt753x_nl_cmd_item mt753x_nl_cmds[] = {
	{
		.cmd = MT753X_CMD_REQUEST,
		.require_dev = false,
		.process = mt753x_nl_get_swdevs
	}, {
		.cmd = MT753X_CMD_READ,
		.require_dev = true,
		.process = mt753x_nl_reply_read,
		.required_attrs = mt753x_nl_cmd_read_attrs,
		.nr_required_attrs = ARRAY_SIZE(mt753x_nl_cmd_read_attrs),
	}, {
		.cmd = MT753X_CMD_WRITE,
		.require_dev = true,
		.process = mt753x_nl_reply_write,
		.required_attrs = mt753x_nl_cmd_write_attrs,
		.nr_required_attrs = ARRAY_SIZE(mt753x_nl_cmd_write_attrs),
	}
};

static int mt753x_nl_response(struct sk_buff *skb, struct genl_info *info)
{
	struct genlmsghdr *hdr = nlmsg_data(info->nlhdr);
	const struct mt753x_nl_cmd_item *cmditem = NULL;
	struct gsw_mt753x *gsw = NULL;
	u32 sat_req_attrs = 0;
	int i, ret;

	for (i = 0; i < ARRAY_SIZE(mt753x_nl_cmds); i++) {
		if (hdr->cmd == mt753x_nl_cmds[i].cmd) {
			cmditem = &mt753x_nl_cmds[i];
			break;
		}
	}

	if (!cmditem) {
		pr_info("mt753x-nl: unknown cmd %u\n", hdr->cmd);
		return -EINVAL;
	}

	for (i = 0; i < cmditem->nr_required_attrs; i++) {
		if (info->attrs[cmditem->required_attrs[i]])
			sat_req_attrs++;
	}

	if (sat_req_attrs != cmditem->nr_required_attrs) {
		pr_info("mt753x-nl: missing required attr(s) for cmd %u\n",
			hdr->cmd);
		return -EINVAL;
	}

	if (cmditem->require_dev) {
		gsw = mt753x_nl_parse_find_gsw(info);
		if (!gsw) {
			pr_info("mt753x-nl: failed to find switch dev\n");
			return -EINVAL;
		}
	}

	ret = cmditem->process(info, gsw);

	mt753x_put_gsw();

	return ret;
}

int mt753x_nl_init(void)
{
	int ret;

	ret = genl_register_family(&mt753x_nl_family);
	if (ret) {
		pr_info("mt753x-nl: genl_register_family_with_ops failed\n");
		return ret;
	}

	return 0;
}

void mt753x_nl_exit(void)
{
	genl_unregister_family(&mt753x_nl_family);
}
