// SPDX-License-Identifier: GPL-2.0
/*
 * Wifi Band Exclusion Interface for WLAN
 * Copyright (C) 2023 Advanced Micro Devices
 *
 */

#include <linux/acpi_amd_wbrf.h>
#include <linux/units.h>
#include <net/cfg80211.h>
#include "ieee80211_i.h"

void ieee80211_check_wbrf_support(struct ieee80211_local *local)
{
	struct wiphy *wiphy = local->hw.wiphy;
	struct device *dev;

	if (!wiphy)
		return;

	dev = wiphy->dev.parent;
	if (!dev)
		return;

	local->wbrf_supported = acpi_amd_wbrf_supported_producer(dev);
	dev_dbg(dev, "WBRF is %s supported\n",
		local->wbrf_supported ? "" : "not");
}

static void get_chan_freq_boundary(u32 center_freq, u32 bandwidth, u64 *start, u64 *end)
{
	bandwidth *= KHZ_PER_MHZ;
	center_freq *= KHZ_PER_MHZ;

	*start = center_freq - bandwidth / 2;
	*end = center_freq + bandwidth / 2;

	/* Frequency in Hz is expected */
	*start = *start * HZ_PER_KHZ;
	*end = *end * HZ_PER_KHZ;
}

static void get_ranges_from_chandef(struct cfg80211_chan_def *chandef,
				    struct wbrf_ranges_in_out *ranges_in)
{
	u64 start_freq1, end_freq1;
	u64 start_freq2, end_freq2;
	int bandwidth;

	bandwidth = nl80211_chan_width_to_mhz(chandef->width);

	get_chan_freq_boundary(chandef->center_freq1, bandwidth, &start_freq1, &end_freq1);

	ranges_in->band_list[0].start = start_freq1;
	ranges_in->band_list[0].end = end_freq1;
	ranges_in->num_of_ranges = 1;

	if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
		get_chan_freq_boundary(chandef->center_freq2, bandwidth, &start_freq2, &end_freq2);

		ranges_in->band_list[1].start = start_freq2;
		ranges_in->band_list[1].end = end_freq2;
		ranges_in->num_of_ranges++;
	}
}

void ieee80211_add_wbrf(struct ieee80211_local *local, struct cfg80211_chan_def *chandef)
{
	struct wbrf_ranges_in_out ranges_in = {0};
	struct device *dev;

	if (!local->wbrf_supported)
		return;

	dev = local->hw.wiphy->dev.parent;

	get_ranges_from_chandef(chandef, &ranges_in);

	acpi_amd_wbrf_add_remove(dev, WBRF_RECORD_ADD, &ranges_in);
}

void ieee80211_remove_wbrf(struct ieee80211_local *local, struct cfg80211_chan_def *chandef)
{
	struct wbrf_ranges_in_out ranges_in = {0};
	struct device *dev;

	if (!local->wbrf_supported)
		return;

	dev = local->hw.wiphy->dev.parent;

	get_ranges_from_chandef(chandef, &ranges_in);

	acpi_amd_wbrf_add_remove(dev, WBRF_RECORD_REMOVE, &ranges_in);
}
