Merge 7781848346 ("hwmon: (xgene-hwmon) use appropriate type for the latency value") into android16-6.12-lts
Steps on the way to 6.12.31 Change-Id: I80fec8af3432b5da8278752d93b64e0b7b61f6b9 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -29,6 +29,7 @@ extern cpumask_var_t node_to_cpumask_map[];
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
extern unsigned long max_pfn;
|
||||
u64 memory_hotplug_max(void);
|
||||
u64 hot_add_drconf_memory_max(void);
|
||||
#else
|
||||
#define memory_hotplug_max() memblock_end_of_DRAM()
|
||||
#endif
|
||||
|
||||
@@ -1336,7 +1336,7 @@ int hot_add_scn_to_nid(unsigned long scn_addr)
|
||||
return nid;
|
||||
}
|
||||
|
||||
static u64 hot_add_drconf_memory_max(void)
|
||||
u64 hot_add_drconf_memory_max(void)
|
||||
{
|
||||
struct device_node *memory = NULL;
|
||||
struct device_node *dn = NULL;
|
||||
|
||||
@@ -2222,6 +2222,10 @@ static struct pmu power_pmu = {
|
||||
#define PERF_SAMPLE_ADDR_TYPE (PERF_SAMPLE_ADDR | \
|
||||
PERF_SAMPLE_PHYS_ADDR | \
|
||||
PERF_SAMPLE_DATA_PAGE_SIZE)
|
||||
|
||||
#define SIER_TYPE_SHIFT 15
|
||||
#define SIER_TYPE_MASK (0x7ull << SIER_TYPE_SHIFT)
|
||||
|
||||
/*
|
||||
* A counter has overflowed; update its count and record
|
||||
* things if requested. Note that interrupts are hard-disabled
|
||||
@@ -2290,6 +2294,22 @@ static void record_and_restart(struct perf_event *event, unsigned long val,
|
||||
is_kernel_addr(mfspr(SPRN_SIAR)))
|
||||
record = 0;
|
||||
|
||||
/*
|
||||
* SIER[46-48] presents instruction type of the sampled instruction.
|
||||
* In ISA v3.0 and before values "0" and "7" are considered reserved.
|
||||
* In ISA v3.1, value "7" has been used to indicate "larx/stcx".
|
||||
* Drop the sample if "type" has reserved values for this field with a
|
||||
* ISA version check.
|
||||
*/
|
||||
if (event->attr.sample_type & PERF_SAMPLE_DATA_SRC &&
|
||||
ppmu->get_mem_data_src) {
|
||||
val = (regs->dar & SIER_TYPE_MASK) >> SIER_TYPE_SHIFT;
|
||||
if (val == 0 || (val == 7 && !cpu_has_feature(CPU_FTR_ARCH_31))) {
|
||||
record = 0;
|
||||
atomic64_inc(&event->lost_samples);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Finally record data if requested.
|
||||
*/
|
||||
|
||||
@@ -321,8 +321,10 @@ void isa207_get_mem_data_src(union perf_mem_data_src *dsrc, u32 flags,
|
||||
|
||||
sier = mfspr(SPRN_SIER);
|
||||
val = (sier & ISA207_SIER_TYPE_MASK) >> ISA207_SIER_TYPE_SHIFT;
|
||||
if (val != 1 && val != 2 && !(val == 7 && cpu_has_feature(CPU_FTR_ARCH_31)))
|
||||
if (val != 1 && val != 2 && !(val == 7 && cpu_has_feature(CPU_FTR_ARCH_31))) {
|
||||
dsrc->val = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
idx = (sier & ISA207_SIER_LDST_MASK) >> ISA207_SIER_LDST_SHIFT;
|
||||
sub_idx = (sier & ISA207_SIER_DATA_SRC_MASK) >> ISA207_SIER_DATA_SRC_SHIFT;
|
||||
|
||||
@@ -52,7 +52,8 @@ enum {
|
||||
enum {
|
||||
DDW_EXT_SIZE = 0,
|
||||
DDW_EXT_RESET_DMA_WIN = 1,
|
||||
DDW_EXT_QUERY_OUT_SIZE = 2
|
||||
DDW_EXT_QUERY_OUT_SIZE = 2,
|
||||
DDW_EXT_LIMITED_ADDR_MODE = 3
|
||||
};
|
||||
|
||||
static struct iommu_table *iommu_pseries_alloc_table(int node)
|
||||
@@ -1284,17 +1285,13 @@ static LIST_HEAD(failed_ddw_pdn_list);
|
||||
|
||||
static phys_addr_t ddw_memory_hotplug_max(void)
|
||||
{
|
||||
resource_size_t max_addr = memory_hotplug_max();
|
||||
struct device_node *memory;
|
||||
resource_size_t max_addr;
|
||||
|
||||
for_each_node_by_type(memory, "memory") {
|
||||
struct resource res;
|
||||
|
||||
if (of_address_to_resource(memory, 0, &res))
|
||||
continue;
|
||||
|
||||
max_addr = max_t(resource_size_t, max_addr, res.end + 1);
|
||||
}
|
||||
#if defined(CONFIG_NUMA) && defined(CONFIG_MEMORY_HOTPLUG)
|
||||
max_addr = hot_add_drconf_memory_max();
|
||||
#else
|
||||
max_addr = memblock_end_of_DRAM();
|
||||
#endif
|
||||
|
||||
return max_addr;
|
||||
}
|
||||
@@ -1331,6 +1328,54 @@ static void reset_dma_window(struct pci_dev *dev, struct device_node *par_dn)
|
||||
ret);
|
||||
}
|
||||
|
||||
/*
|
||||
* Platforms support placing PHB in limited address mode starting with LoPAR
|
||||
* level 2.13 implement. In this mode, the DMA address returned by DDW is over
|
||||
* 4GB but, less than 64-bits. This benefits IO adapters that don't support
|
||||
* 64-bits for DMA addresses.
|
||||
*/
|
||||
static int limited_dma_window(struct pci_dev *dev, struct device_node *par_dn)
|
||||
{
|
||||
int ret;
|
||||
u32 cfg_addr, reset_dma_win, las_supported;
|
||||
u64 buid;
|
||||
struct device_node *dn;
|
||||
struct pci_dn *pdn;
|
||||
|
||||
ret = ddw_read_ext(par_dn, DDW_EXT_RESET_DMA_WIN, &reset_dma_win);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = ddw_read_ext(par_dn, DDW_EXT_LIMITED_ADDR_MODE, &las_supported);
|
||||
|
||||
/* Limited Address Space extension available on the platform but DDW in
|
||||
* limited addressing mode not supported
|
||||
*/
|
||||
if (!ret && !las_supported)
|
||||
ret = -EPROTO;
|
||||
|
||||
if (ret) {
|
||||
dev_info(&dev->dev, "Limited Address Space for DDW not Supported, err: %d", ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
dn = pci_device_to_OF_node(dev);
|
||||
pdn = PCI_DN(dn);
|
||||
buid = pdn->phb->buid;
|
||||
cfg_addr = (pdn->busno << 16) | (pdn->devfn << 8);
|
||||
|
||||
ret = rtas_call(reset_dma_win, 4, 1, NULL, cfg_addr, BUID_HI(buid),
|
||||
BUID_LO(buid), 1);
|
||||
if (ret)
|
||||
dev_info(&dev->dev,
|
||||
"ibm,reset-pe-dma-windows(%x) for Limited Addr Support: %x %x %x returned %d ",
|
||||
reset_dma_win, cfg_addr, BUID_HI(buid), BUID_LO(buid),
|
||||
ret);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Return largest page shift based on "IO Page Sizes" output of ibm,query-pe-dma-window. */
|
||||
static int iommu_get_page_shift(u32 query_page_size)
|
||||
{
|
||||
@@ -1398,7 +1443,7 @@ static struct property *ddw_property_create(const char *propname, u32 liobn, u64
|
||||
*
|
||||
* returns true if can map all pages (direct mapping), false otherwise..
|
||||
*/
|
||||
static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
|
||||
static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn, u64 dma_mask)
|
||||
{
|
||||
int len = 0, ret;
|
||||
int max_ram_len = order_base_2(ddw_memory_hotplug_max());
|
||||
@@ -1417,6 +1462,9 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
|
||||
bool pmem_present;
|
||||
struct pci_dn *pci = PCI_DN(pdn);
|
||||
struct property *default_win = NULL;
|
||||
bool limited_addr_req = false, limited_addr_enabled = false;
|
||||
int dev_max_ddw;
|
||||
int ddw_sz;
|
||||
|
||||
dn = of_find_node_by_type(NULL, "ibm,pmemory");
|
||||
pmem_present = dn != NULL;
|
||||
@@ -1443,7 +1491,6 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
|
||||
* the ibm,ddw-applicable property holds the tokens for:
|
||||
* ibm,query-pe-dma-window
|
||||
* ibm,create-pe-dma-window
|
||||
* ibm,remove-pe-dma-window
|
||||
* for the given node in that order.
|
||||
* the property is actually in the parent, not the PE
|
||||
*/
|
||||
@@ -1463,6 +1510,20 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
|
||||
if (ret != 0)
|
||||
goto out_failed;
|
||||
|
||||
/* DMA Limited Addressing required? This is when the driver has
|
||||
* requested to create DDW but supports mask which is less than 64-bits
|
||||
*/
|
||||
limited_addr_req = (dma_mask != DMA_BIT_MASK(64));
|
||||
|
||||
/* place the PHB in Limited Addressing mode */
|
||||
if (limited_addr_req) {
|
||||
if (limited_dma_window(dev, pdn))
|
||||
goto out_failed;
|
||||
|
||||
/* PHB is in Limited address mode */
|
||||
limited_addr_enabled = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* If there is no window available, remove the default DMA window,
|
||||
* if it's present. This will make all the resources available to the
|
||||
@@ -1509,6 +1570,15 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
|
||||
goto out_failed;
|
||||
}
|
||||
|
||||
/* Maximum DMA window size that the device can address (in log2) */
|
||||
dev_max_ddw = fls64(dma_mask);
|
||||
|
||||
/* If the device DMA mask is less than 64-bits, make sure the DMA window
|
||||
* size is not bigger than what the device can access
|
||||
*/
|
||||
ddw_sz = min(order_base_2(query.largest_available_block << page_shift),
|
||||
dev_max_ddw);
|
||||
|
||||
/*
|
||||
* The "ibm,pmemory" can appear anywhere in the address space.
|
||||
* Assuming it is still backed by page structs, try MAX_PHYSMEM_BITS
|
||||
@@ -1517,23 +1587,21 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
|
||||
*/
|
||||
len = max_ram_len;
|
||||
if (pmem_present) {
|
||||
if (query.largest_available_block >=
|
||||
(1ULL << (MAX_PHYSMEM_BITS - page_shift)))
|
||||
if (ddw_sz >= MAX_PHYSMEM_BITS)
|
||||
len = MAX_PHYSMEM_BITS;
|
||||
else
|
||||
dev_info(&dev->dev, "Skipping ibm,pmemory");
|
||||
}
|
||||
|
||||
/* check if the available block * number of ptes will map everything */
|
||||
if (query.largest_available_block < (1ULL << (len - page_shift))) {
|
||||
if (ddw_sz < len) {
|
||||
dev_dbg(&dev->dev,
|
||||
"can't map partition max 0x%llx with %llu %llu-sized pages\n",
|
||||
1ULL << len,
|
||||
query.largest_available_block,
|
||||
1ULL << page_shift);
|
||||
|
||||
len = order_base_2(query.largest_available_block << page_shift);
|
||||
|
||||
len = ddw_sz;
|
||||
dynamic_mapping = true;
|
||||
} else {
|
||||
direct_mapping = !default_win_removed ||
|
||||
@@ -1547,8 +1615,9 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
|
||||
*/
|
||||
if (default_win_removed && pmem_present && !direct_mapping) {
|
||||
/* DDW is big enough to be split */
|
||||
if ((query.largest_available_block << page_shift) >=
|
||||
MIN_DDW_VPMEM_DMA_WINDOW + (1ULL << max_ram_len)) {
|
||||
if ((1ULL << ddw_sz) >=
|
||||
MIN_DDW_VPMEM_DMA_WINDOW + (1ULL << max_ram_len)) {
|
||||
|
||||
direct_mapping = true;
|
||||
|
||||
/* offset of the Dynamic part of DDW */
|
||||
@@ -1559,8 +1628,7 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
|
||||
dynamic_mapping = true;
|
||||
|
||||
/* create max size DDW possible */
|
||||
len = order_base_2(query.largest_available_block
|
||||
<< page_shift);
|
||||
len = ddw_sz;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1600,7 +1668,7 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
|
||||
|
||||
if (direct_mapping) {
|
||||
/* DDW maps the whole partition, so enable direct DMA mapping */
|
||||
ret = walk_system_ram_range(0, memblock_end_of_DRAM() >> PAGE_SHIFT,
|
||||
ret = walk_system_ram_range(0, ddw_memory_hotplug_max() >> PAGE_SHIFT,
|
||||
win64->value, tce_setrange_multi_pSeriesLP_walk);
|
||||
if (ret) {
|
||||
dev_info(&dev->dev, "failed to map DMA window for %pOF: %d\n",
|
||||
@@ -1689,7 +1757,7 @@ out_remove_win:
|
||||
__remove_dma_window(pdn, ddw_avail, create.liobn);
|
||||
|
||||
out_failed:
|
||||
if (default_win_removed)
|
||||
if (default_win_removed || limited_addr_enabled)
|
||||
reset_dma_window(dev, pdn);
|
||||
|
||||
fpdn = kzalloc(sizeof(*fpdn), GFP_KERNEL);
|
||||
@@ -1708,6 +1776,9 @@ out_unlock:
|
||||
dev->dev.bus_dma_limit = dev->dev.archdata.dma_offset +
|
||||
(1ULL << max_ram_len);
|
||||
|
||||
dev_info(&dev->dev, "lsa_required: %x, lsa_enabled: %x, direct mapping: %x\n",
|
||||
limited_addr_req, limited_addr_enabled, direct_mapping);
|
||||
|
||||
return direct_mapping;
|
||||
}
|
||||
|
||||
@@ -1833,8 +1904,11 @@ static bool iommu_bypass_supported_pSeriesLP(struct pci_dev *pdev, u64 dma_mask)
|
||||
{
|
||||
struct device_node *dn = pci_device_to_OF_node(pdev), *pdn;
|
||||
|
||||
/* only attempt to use a new window if 64-bit DMA is requested */
|
||||
if (dma_mask < DMA_BIT_MASK(64))
|
||||
/* For DDW, DMA mask should be more than 32-bits. For mask more then
|
||||
* 32-bits but less then 64-bits, DMA addressing is supported in
|
||||
* Limited Addressing mode.
|
||||
*/
|
||||
if (dma_mask <= DMA_BIT_MASK(32))
|
||||
return false;
|
||||
|
||||
dev_dbg(&pdev->dev, "node is %pOF\n", dn);
|
||||
@@ -1847,7 +1921,7 @@ static bool iommu_bypass_supported_pSeriesLP(struct pci_dev *pdev, u64 dma_mask)
|
||||
*/
|
||||
pdn = pci_dma_find(dn, NULL);
|
||||
if (pdn && PCI_DN(pdn))
|
||||
return enable_ddw(pdev, pdn);
|
||||
return enable_ddw(pdev, pdn, dma_mask);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -2349,11 +2423,17 @@ static int iommu_mem_notifier(struct notifier_block *nb, unsigned long action,
|
||||
struct memory_notify *arg = data;
|
||||
int ret = 0;
|
||||
|
||||
/* This notifier can get called when onlining persistent memory as well.
|
||||
* TCEs are not pre-mapped for persistent memory. Persistent memory will
|
||||
* always be above ddw_memory_hotplug_max()
|
||||
*/
|
||||
|
||||
switch (action) {
|
||||
case MEM_GOING_ONLINE:
|
||||
spin_lock(&dma_win_list_lock);
|
||||
list_for_each_entry(window, &dma_win_list, list) {
|
||||
if (window->direct) {
|
||||
if (window->direct && (arg->start_pfn << PAGE_SHIFT) <
|
||||
ddw_memory_hotplug_max()) {
|
||||
ret |= tce_setrange_multi_pSeriesLP(arg->start_pfn,
|
||||
arg->nr_pages, window->prop);
|
||||
}
|
||||
@@ -2365,7 +2445,8 @@ static int iommu_mem_notifier(struct notifier_block *nb, unsigned long action,
|
||||
case MEM_OFFLINE:
|
||||
spin_lock(&dma_win_list_lock);
|
||||
list_for_each_entry(window, &dma_win_list, list) {
|
||||
if (window->direct) {
|
||||
if (window->direct && (arg->start_pfn << PAGE_SHIFT) <
|
||||
ddw_memory_hotplug_max()) {
|
||||
ret |= tce_clearrange_multi_pSeriesLP(arg->start_pfn,
|
||||
arg->nr_pages, window->prop);
|
||||
}
|
||||
|
||||
@@ -411,7 +411,7 @@ static struct clk_rcg2 cam_cc_bps_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -433,7 +433,7 @@ static struct clk_rcg2 cam_cc_camnoc_axi_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -454,7 +454,7 @@ static struct clk_rcg2 cam_cc_cci_0_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -469,7 +469,7 @@ static struct clk_rcg2 cam_cc_cci_1_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -490,7 +490,7 @@ static struct clk_rcg2 cam_cc_cphy_rx_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -511,7 +511,7 @@ static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -526,7 +526,7 @@ static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -556,7 +556,7 @@ static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -571,7 +571,7 @@ static struct clk_rcg2 cam_cc_csi4phytimer_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -586,7 +586,7 @@ static struct clk_rcg2 cam_cc_csi5phytimer_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -611,7 +611,7 @@ static struct clk_rcg2 cam_cc_fast_ahb_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -634,7 +634,7 @@ static struct clk_rcg2 cam_cc_fd_core_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -649,7 +649,7 @@ static struct clk_rcg2 cam_cc_icp_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -673,7 +673,7 @@ static struct clk_rcg2 cam_cc_ife_0_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_2,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -710,7 +710,7 @@ static struct clk_rcg2 cam_cc_ife_0_csid_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -734,7 +734,7 @@ static struct clk_rcg2 cam_cc_ife_1_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_3,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -749,7 +749,7 @@ static struct clk_rcg2 cam_cc_ife_1_csid_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -771,7 +771,7 @@ static struct clk_rcg2 cam_cc_ife_lite_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -786,7 +786,7 @@ static struct clk_rcg2 cam_cc_ife_lite_csid_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -810,7 +810,7 @@ static struct clk_rcg2 cam_cc_ipe_0_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_4,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_4),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -825,7 +825,7 @@ static struct clk_rcg2 cam_cc_jpeg_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -847,7 +847,7 @@ static struct clk_rcg2 cam_cc_mclk0_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -862,7 +862,7 @@ static struct clk_rcg2 cam_cc_mclk1_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -877,7 +877,7 @@ static struct clk_rcg2 cam_cc_mclk2_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -892,7 +892,7 @@ static struct clk_rcg2 cam_cc_mclk3_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -907,7 +907,7 @@ static struct clk_rcg2 cam_cc_mclk4_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -922,7 +922,7 @@ static struct clk_rcg2 cam_cc_mclk5_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -993,7 +993,7 @@ static struct clk_rcg2 cam_cc_slow_ahb_clk_src = {
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
#include "amdgpu_securedisplay.h"
|
||||
#include "amdgpu_atomfirmware.h"
|
||||
|
||||
#define AMD_VBIOS_FILE_MAX_SIZE_B (1024*1024*3)
|
||||
#define AMD_VBIOS_FILE_MAX_SIZE_B (1024*1024*16)
|
||||
|
||||
static int psp_load_smu_fw(struct psp_context *psp);
|
||||
static int psp_rap_terminate(struct psp_context *psp);
|
||||
@@ -531,7 +531,6 @@ static int psp_sw_fini(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
struct psp_context *psp = &adev->psp;
|
||||
struct psp_gfx_cmd_resp *cmd = psp->cmd;
|
||||
|
||||
psp_memory_training_fini(psp);
|
||||
|
||||
@@ -541,8 +540,8 @@ static int psp_sw_fini(void *handle)
|
||||
amdgpu_ucode_release(&psp->cap_fw);
|
||||
amdgpu_ucode_release(&psp->toc_fw);
|
||||
|
||||
kfree(cmd);
|
||||
cmd = NULL;
|
||||
kfree(psp->cmd);
|
||||
psp->cmd = NULL;
|
||||
|
||||
psp_free_shared_bufs(psp);
|
||||
|
||||
|
||||
@@ -383,6 +383,45 @@ int amdgpu_umc_fill_error_record(struct ras_err_data *err_data,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amdgpu_umc_loop_all_aid(struct amdgpu_device *adev, umc_func func,
|
||||
void *data)
|
||||
{
|
||||
uint32_t umc_node_inst;
|
||||
uint32_t node_inst;
|
||||
uint32_t umc_inst;
|
||||
uint32_t ch_inst;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* This loop is done based on the following -
|
||||
* umc.active mask = mask of active umc instances across all nodes
|
||||
* umc.umc_inst_num = maximum number of umc instancess per node
|
||||
* umc.node_inst_num = maximum number of node instances
|
||||
* Channel instances are not assumed to be harvested.
|
||||
*/
|
||||
dev_dbg(adev->dev, "active umcs :%lx umc_inst per node: %d",
|
||||
adev->umc.active_mask, adev->umc.umc_inst_num);
|
||||
for_each_set_bit(umc_node_inst, &(adev->umc.active_mask),
|
||||
adev->umc.node_inst_num * adev->umc.umc_inst_num) {
|
||||
node_inst = umc_node_inst / adev->umc.umc_inst_num;
|
||||
umc_inst = umc_node_inst % adev->umc.umc_inst_num;
|
||||
LOOP_UMC_CH_INST(ch_inst) {
|
||||
dev_dbg(adev->dev,
|
||||
"node_inst :%d umc_inst: %d ch_inst: %d",
|
||||
node_inst, umc_inst, ch_inst);
|
||||
ret = func(adev, node_inst, umc_inst, ch_inst, data);
|
||||
if (ret) {
|
||||
dev_err(adev->dev,
|
||||
"Node %d umc %d ch %d func returns %d\n",
|
||||
node_inst, umc_inst, ch_inst, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int amdgpu_umc_loop_channels(struct amdgpu_device *adev,
|
||||
umc_func func, void *data)
|
||||
{
|
||||
@@ -391,6 +430,9 @@ int amdgpu_umc_loop_channels(struct amdgpu_device *adev,
|
||||
uint32_t ch_inst = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (adev->aid_mask)
|
||||
return amdgpu_umc_loop_all_aid(adev, func, data);
|
||||
|
||||
if (adev->umc.node_inst_num) {
|
||||
LOOP_UMC_EACH_NODE_INST_AND_CH(node_inst, umc_inst, ch_inst) {
|
||||
ret = func(adev, node_inst, umc_inst, ch_inst, data);
|
||||
|
||||
@@ -1461,7 +1461,6 @@ static void gmc_v9_0_set_umc_funcs(struct amdgpu_device *adev)
|
||||
adev->umc.umc_inst_num = UMC_V12_0_UMC_INSTANCE_NUM;
|
||||
adev->umc.node_inst_num /= UMC_V12_0_UMC_INSTANCE_NUM;
|
||||
adev->umc.channel_offs = UMC_V12_0_PER_CHANNEL_OFFSET;
|
||||
adev->umc.active_mask = adev->aid_mask;
|
||||
adev->umc.retire_unit = UMC_V12_0_BAD_PAGE_NUM_PER_CHANNEL;
|
||||
if (!adev->gmc.xgmi.connected_to_cpu && !adev->gmc.is_app_apu)
|
||||
adev->umc.ras = &umc_v12_0_ras;
|
||||
|
||||
@@ -690,7 +690,7 @@ static int mes_v11_0_set_hw_resources(struct amdgpu_mes *mes)
|
||||
|
||||
static int mes_v11_0_set_hw_resources_1(struct amdgpu_mes *mes)
|
||||
{
|
||||
int size = 128 * PAGE_SIZE;
|
||||
int size = 128 * AMDGPU_GPU_PAGE_SIZE;
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = mes->adev;
|
||||
union MESAPI_SET_HW_RESOURCES_1 mes_set_hw_res_pkt;
|
||||
|
||||
@@ -172,6 +172,30 @@ static void mmhub_v1_7_init_tlb_regs(struct amdgpu_device *adev)
|
||||
WREG32_SOC15(MMHUB, 0, regMC_VM_MX_L1_TLB_CNTL, tmp);
|
||||
}
|
||||
|
||||
/* Set snoop bit for SDMA so that SDMA writes probe-invalidates RW lines */
|
||||
static void mmhub_v1_7_init_snoop_override_regs(struct amdgpu_device *adev)
|
||||
{
|
||||
uint32_t tmp;
|
||||
int i;
|
||||
uint32_t distance = regDAGB1_WRCLI_GPU_SNOOP_OVERRIDE -
|
||||
regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE;
|
||||
|
||||
for (i = 0; i < 5; i++) { /* DAGB instances */
|
||||
tmp = RREG32_SOC15_OFFSET(MMHUB, 0,
|
||||
regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, i * distance);
|
||||
tmp |= (1 << 15); /* SDMA client is BIT15 */
|
||||
WREG32_SOC15_OFFSET(MMHUB, 0,
|
||||
regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, i * distance, tmp);
|
||||
|
||||
tmp = RREG32_SOC15_OFFSET(MMHUB, 0,
|
||||
regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, i * distance);
|
||||
tmp |= (1 << 15);
|
||||
WREG32_SOC15_OFFSET(MMHUB, 0,
|
||||
regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, i * distance, tmp);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void mmhub_v1_7_init_cache_regs(struct amdgpu_device *adev)
|
||||
{
|
||||
uint32_t tmp;
|
||||
@@ -337,6 +361,7 @@ static int mmhub_v1_7_gart_enable(struct amdgpu_device *adev)
|
||||
mmhub_v1_7_init_system_aperture_regs(adev);
|
||||
mmhub_v1_7_init_tlb_regs(adev);
|
||||
mmhub_v1_7_init_cache_regs(adev);
|
||||
mmhub_v1_7_init_snoop_override_regs(adev);
|
||||
|
||||
mmhub_v1_7_enable_system_domain(adev);
|
||||
mmhub_v1_7_disable_identity_aperture(adev);
|
||||
|
||||
@@ -214,6 +214,32 @@ static void mmhub_v1_8_init_tlb_regs(struct amdgpu_device *adev)
|
||||
}
|
||||
}
|
||||
|
||||
/* Set snoop bit for SDMA so that SDMA writes probe-invalidates RW lines */
|
||||
static void mmhub_v1_8_init_snoop_override_regs(struct amdgpu_device *adev)
|
||||
{
|
||||
uint32_t tmp, inst_mask;
|
||||
int i, j;
|
||||
uint32_t distance = regDAGB1_WRCLI_GPU_SNOOP_OVERRIDE -
|
||||
regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE;
|
||||
|
||||
inst_mask = adev->aid_mask;
|
||||
for_each_inst(i, inst_mask) {
|
||||
for (j = 0; j < 5; j++) { /* DAGB instances */
|
||||
tmp = RREG32_SOC15_OFFSET(MMHUB, i,
|
||||
regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, j * distance);
|
||||
tmp |= (1 << 15); /* SDMA client is BIT15 */
|
||||
WREG32_SOC15_OFFSET(MMHUB, i,
|
||||
regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE, j * distance, tmp);
|
||||
|
||||
tmp = RREG32_SOC15_OFFSET(MMHUB, i,
|
||||
regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, j * distance);
|
||||
tmp |= (1 << 15);
|
||||
WREG32_SOC15_OFFSET(MMHUB, i,
|
||||
regDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE, j * distance, tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void mmhub_v1_8_init_cache_regs(struct amdgpu_device *adev)
|
||||
{
|
||||
uint32_t tmp, inst_mask;
|
||||
@@ -419,6 +445,7 @@ static int mmhub_v1_8_gart_enable(struct amdgpu_device *adev)
|
||||
mmhub_v1_8_init_system_aperture_regs(adev);
|
||||
mmhub_v1_8_init_tlb_regs(adev);
|
||||
mmhub_v1_8_init_cache_regs(adev);
|
||||
mmhub_v1_8_init_snoop_override_regs(adev);
|
||||
|
||||
mmhub_v1_8_enable_system_domain(adev);
|
||||
mmhub_v1_8_disable_identity_aperture(adev);
|
||||
|
||||
@@ -198,6 +198,36 @@ static void mmhub_v9_4_init_tlb_regs(struct amdgpu_device *adev, int hubid)
|
||||
hubid * MMHUB_INSTANCE_REGISTER_OFFSET, tmp);
|
||||
}
|
||||
|
||||
/* Set snoop bit for SDMA so that SDMA writes probe-invalidates RW lines */
|
||||
static void mmhub_v9_4_init_snoop_override_regs(struct amdgpu_device *adev, int hubid)
|
||||
{
|
||||
uint32_t tmp;
|
||||
int i;
|
||||
uint32_t distance = mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE -
|
||||
mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE;
|
||||
uint32_t huboffset = hubid * MMHUB_INSTANCE_REGISTER_OFFSET;
|
||||
|
||||
for (i = 0; i < 5 - (2 * hubid); i++) {
|
||||
/* DAGB instances 0 to 4 are in hub0 and 5 to 7 are in hub1 */
|
||||
tmp = RREG32_SOC15_OFFSET(MMHUB, 0,
|
||||
mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE,
|
||||
huboffset + i * distance);
|
||||
tmp |= (1 << 15); /* SDMA client is BIT15 */
|
||||
WREG32_SOC15_OFFSET(MMHUB, 0,
|
||||
mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE,
|
||||
huboffset + i * distance, tmp);
|
||||
|
||||
tmp = RREG32_SOC15_OFFSET(MMHUB, 0,
|
||||
mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE,
|
||||
huboffset + i * distance);
|
||||
tmp |= (1 << 15);
|
||||
WREG32_SOC15_OFFSET(MMHUB, 0,
|
||||
mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE,
|
||||
huboffset + i * distance, tmp);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void mmhub_v9_4_init_cache_regs(struct amdgpu_device *adev, int hubid)
|
||||
{
|
||||
uint32_t tmp;
|
||||
@@ -392,6 +422,7 @@ static int mmhub_v9_4_gart_enable(struct amdgpu_device *adev)
|
||||
if (!amdgpu_sriov_vf(adev))
|
||||
mmhub_v9_4_init_cache_regs(adev, i);
|
||||
|
||||
mmhub_v9_4_init_snoop_override_regs(adev, i);
|
||||
mmhub_v9_4_enable_system_domain(adev, i);
|
||||
if (!amdgpu_sriov_vf(adev))
|
||||
mmhub_v9_4_disable_identity_aperture(adev, i);
|
||||
|
||||
@@ -1683,17 +1683,32 @@ static int fill_in_l2_l3_pcache(struct kfd_cache_properties **props_ext,
|
||||
int cache_type, unsigned int cu_processor_id,
|
||||
struct kfd_node *knode)
|
||||
{
|
||||
unsigned int cu_sibling_map_mask;
|
||||
unsigned int cu_sibling_map_mask = 0;
|
||||
int first_active_cu;
|
||||
int i, j, k, xcc, start, end;
|
||||
int num_xcc = NUM_XCC(knode->xcc_mask);
|
||||
struct kfd_cache_properties *pcache = NULL;
|
||||
enum amdgpu_memory_partition mode;
|
||||
struct amdgpu_device *adev = knode->adev;
|
||||
bool found = false;
|
||||
|
||||
start = ffs(knode->xcc_mask) - 1;
|
||||
end = start + num_xcc;
|
||||
cu_sibling_map_mask = cu_info->bitmap[start][0][0];
|
||||
|
||||
/* To find the bitmap in the first active cu in the first
|
||||
* xcc, it is based on the assumption that evrey xcc must
|
||||
* have at least one active cu.
|
||||
*/
|
||||
for (i = 0; i < gfx_info->max_shader_engines && !found; i++) {
|
||||
for (j = 0; j < gfx_info->max_sh_per_se && !found; j++) {
|
||||
if (cu_info->bitmap[start][i % 4][j % 4]) {
|
||||
cu_sibling_map_mask =
|
||||
cu_info->bitmap[start][i % 4][j % 4];
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cu_sibling_map_mask &=
|
||||
((1 << pcache_info[cache_type].num_cu_shared) - 1);
|
||||
first_active_cu = ffs(cu_sibling_map_mask);
|
||||
|
||||
@@ -8288,7 +8288,7 @@ static int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap,
|
||||
int i;
|
||||
int result = -EIO;
|
||||
|
||||
if (!ddc_service->ddc_pin || !ddc_service->ddc_pin->hw_info.hw_supported)
|
||||
if (!ddc_service->ddc_pin)
|
||||
return result;
|
||||
|
||||
cmd.payloads = kcalloc(num, sizeof(struct i2c_payload), GFP_KERNEL);
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
|
||||
#include "dml/dcn401/dcn401_fpu.h"
|
||||
|
||||
#define DCN_BASE__INST0_SEG1 0x000000C0
|
||||
|
||||
#define mmCLK01_CLK0_CLK_PLL_REQ 0x16E37
|
||||
#define mmCLK01_CLK0_CLK0_DFS_CNTL 0x16E69
|
||||
#define mmCLK01_CLK0_CLK1_DFS_CNTL 0x16E6C
|
||||
|
||||
@@ -276,6 +276,7 @@ static bool create_links(
|
||||
link->link_id.type = OBJECT_TYPE_CONNECTOR;
|
||||
link->link_id.id = CONNECTOR_ID_VIRTUAL;
|
||||
link->link_id.enum_id = ENUM_ID_1;
|
||||
link->psr_settings.psr_version = DC_PSR_VERSION_UNSUPPORTED;
|
||||
link->link_enc = kzalloc(sizeof(*link->link_enc), GFP_KERNEL);
|
||||
|
||||
if (!link->link_enc) {
|
||||
|
||||
@@ -1009,6 +1009,13 @@ struct psr_settings {
|
||||
unsigned int psr_sdp_transmit_line_num_deadline;
|
||||
uint8_t force_ffu_mode;
|
||||
unsigned int psr_power_opt;
|
||||
|
||||
/**
|
||||
* Some panels cannot handle idle pattern during PSR entry.
|
||||
* To power down phy before disable stream to avoid sending
|
||||
* idle pattern.
|
||||
*/
|
||||
uint8_t power_down_phy_before_disable_stream;
|
||||
};
|
||||
|
||||
enum replay_coasting_vtotal_type {
|
||||
|
||||
@@ -419,6 +419,10 @@ static bool dmub_psr_copy_settings(struct dmub_psr *dmub,
|
||||
copy_settings_data->relock_delay_frame_cnt = 0;
|
||||
if (link->dpcd_caps.sink_dev_id == DP_BRANCH_DEVICE_ID_001CF8)
|
||||
copy_settings_data->relock_delay_frame_cnt = 2;
|
||||
|
||||
copy_settings_data->power_down_phy_before_disable_stream =
|
||||
link->psr_settings.power_down_phy_before_disable_stream;
|
||||
|
||||
copy_settings_data->dsc_slice_height = psr_context->dsc_slice_height;
|
||||
|
||||
dc_wake_and_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
|
||||
|
||||
@@ -367,6 +367,8 @@ void dcn35_update_bw_bounding_box_fpu(struct dc *dc,
|
||||
clock_limits[i].socclk_mhz;
|
||||
dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].memclk_mhz =
|
||||
clk_table->entries[i].memclk_mhz * clk_table->entries[i].wck_ratio;
|
||||
|
||||
dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].dram_speed_mts = clock_limits[i].dram_speed_mts;
|
||||
dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].dtbclk_mhz =
|
||||
clock_limits[i].dtbclk_mhz;
|
||||
dc->dml2_options.bbox_overrides.clks_table.num_entries_per_clk.num_dcfclk_levels =
|
||||
|
||||
@@ -401,6 +401,7 @@ void dcn351_update_bw_bounding_box_fpu(struct dc *dc,
|
||||
clock_limits[i].socclk_mhz;
|
||||
dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].memclk_mhz =
|
||||
clk_table->entries[i].memclk_mhz * clk_table->entries[i].wck_ratio;
|
||||
dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].dram_speed_mts = clock_limits[i].dram_speed_mts;
|
||||
dc->dml2_options.bbox_overrides.clks_table.clk_entries[i].dtbclk_mhz =
|
||||
clock_limits[i].dtbclk_mhz;
|
||||
dc->dml2_options.bbox_overrides.clks_table.num_entries_per_clk.num_dcfclk_levels =
|
||||
|
||||
@@ -3630,13 +3630,12 @@ static unsigned int CalculateMaxVStartup(
|
||||
double line_time_us = (double)timing->h_total / ((double)timing->pixel_clock_khz / 1000);
|
||||
unsigned int vblank_actual = timing->v_total - timing->v_active;
|
||||
unsigned int vblank_nom_default_in_line = (unsigned int)math_floor2((double)vblank_nom_default_us / line_time_us, 1.0);
|
||||
unsigned int vblank_nom_input = (unsigned int)math_min2(timing->vblank_nom, vblank_nom_default_in_line);
|
||||
unsigned int vblank_avail = (vblank_nom_input == 0) ? vblank_nom_default_in_line : vblank_nom_input;
|
||||
unsigned int vblank_avail = (timing->vblank_nom == 0) ? vblank_nom_default_in_line : (unsigned int)timing->vblank_nom;
|
||||
|
||||
vblank_size = (unsigned int)math_min2(vblank_actual, vblank_avail);
|
||||
|
||||
if (timing->interlaced && !ptoi_supported)
|
||||
max_vstartup_lines = (unsigned int)(math_floor2(vblank_size / 2.0, 1.0));
|
||||
max_vstartup_lines = (unsigned int)(math_floor2((vblank_size - 1) / 2.0, 1.0));
|
||||
else
|
||||
max_vstartup_lines = vblank_size - (unsigned int)math_max2(1.0, math_ceil2(write_back_delay_us / line_time_us, 1.0));
|
||||
#ifdef __DML_VBA_DEBUG__
|
||||
|
||||
@@ -159,6 +159,7 @@ struct dml2_clks_table_entry {
|
||||
unsigned int dtbclk_mhz;
|
||||
unsigned int dispclk_mhz;
|
||||
unsigned int dppclk_mhz;
|
||||
unsigned int dram_speed_mts; /*which is based on wck_ratio*/
|
||||
};
|
||||
|
||||
struct dml2_clks_num_entries {
|
||||
|
||||
@@ -1888,7 +1888,6 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
|
||||
bool can_apply_edp_fast_boot = false;
|
||||
bool can_apply_seamless_boot = false;
|
||||
bool keep_edp_vdd_on = false;
|
||||
struct dc_bios *dcb = dc->ctx->dc_bios;
|
||||
DC_LOGGER_INIT();
|
||||
|
||||
|
||||
@@ -1965,8 +1964,6 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
|
||||
hws->funcs.edp_backlight_control(edp_link_with_sink, false);
|
||||
}
|
||||
/*resume from S3, no vbios posting, no need to power down again*/
|
||||
if (dcb && dcb->funcs && !dcb->funcs->is_accelerated_mode(dcb))
|
||||
clk_mgr_exit_optimized_pwr_state(dc, dc->clk_mgr);
|
||||
|
||||
power_down_all_hw_blocks(dc);
|
||||
|
||||
@@ -1979,8 +1976,6 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
|
||||
disable_vga_and_power_gate_all_controllers(dc);
|
||||
if (edp_link_with_sink && !keep_edp_vdd_on)
|
||||
dc->hwss.edp_power_control(edp_link_with_sink, false);
|
||||
if (dcb && dcb->funcs && !dcb->funcs->is_accelerated_mode(dcb))
|
||||
clk_mgr_optimize_pwr_state(dc, dc->clk_mgr);
|
||||
}
|
||||
bios_set_scratch_acc_mode_change(dc->ctx->dc_bios, 1);
|
||||
}
|
||||
|
||||
@@ -621,7 +621,7 @@ struct dc_state {
|
||||
*/
|
||||
struct bw_context bw_ctx;
|
||||
|
||||
struct block_sequence block_sequence[50];
|
||||
struct block_sequence block_sequence[100];
|
||||
unsigned int block_sequence_steps;
|
||||
struct dc_dmub_cmd dc_dmub_cmd[10];
|
||||
unsigned int dmub_cmd_count;
|
||||
|
||||
@@ -221,6 +221,7 @@ enum dentist_divider_range {
|
||||
CLK_SF(CLK0_CLK_PLL_REQ, FbMult_frac, mask_sh)
|
||||
|
||||
#define CLK_REG_LIST_DCN401() \
|
||||
SR(DENTIST_DISPCLK_CNTL), \
|
||||
CLK_SR_DCN401(CLK0_CLK_PLL_REQ, CLK01, 0), \
|
||||
CLK_SR_DCN401(CLK0_CLK0_DFS_CNTL, CLK01, 0), \
|
||||
CLK_SR_DCN401(CLK0_CLK1_DFS_CNTL, CLK01, 0), \
|
||||
|
||||
@@ -75,7 +75,8 @@ void dp_disable_link_phy(struct dc_link *link,
|
||||
struct dc *dc = link->ctx->dc;
|
||||
|
||||
if (!link->wa_flags.dp_keep_receiver_powered &&
|
||||
!link->skip_implict_edp_power_control)
|
||||
!link->skip_implict_edp_power_control &&
|
||||
link->type != dc_connection_none)
|
||||
dpcd_write_rx_power_ctrl(link, false);
|
||||
|
||||
dc->hwss.disable_link_output(link, link_res, signal);
|
||||
@@ -163,8 +164,9 @@ enum dc_status dp_set_fec_ready(struct dc_link *link, const struct link_resource
|
||||
} else {
|
||||
if (link->fec_state == dc_link_fec_ready) {
|
||||
fec_config = 0;
|
||||
core_link_write_dpcd(link, DP_FEC_CONFIGURATION,
|
||||
&fec_config, sizeof(fec_config));
|
||||
if (link->type != dc_connection_none)
|
||||
core_link_write_dpcd(link, DP_FEC_CONFIGURATION,
|
||||
&fec_config, sizeof(fec_config));
|
||||
|
||||
link_enc->funcs->fec_set_ready(link_enc, false);
|
||||
link->fec_state = dc_link_fec_not_ready;
|
||||
|
||||
@@ -36,7 +36,8 @@
|
||||
link->ctx->logger
|
||||
|
||||
static int32_t get_cr_training_aux_rd_interval(struct dc_link *link,
|
||||
const struct dc_link_settings *link_settings)
|
||||
const struct dc_link_settings *link_settings,
|
||||
enum lttpr_mode lttpr_mode)
|
||||
{
|
||||
union training_aux_rd_interval training_rd_interval;
|
||||
uint32_t wait_in_micro_secs = 100;
|
||||
@@ -49,6 +50,8 @@ static int32_t get_cr_training_aux_rd_interval(struct dc_link *link,
|
||||
DP_TRAINING_AUX_RD_INTERVAL,
|
||||
(uint8_t *)&training_rd_interval,
|
||||
sizeof(training_rd_interval));
|
||||
if (lttpr_mode != LTTPR_MODE_NON_TRANSPARENT)
|
||||
wait_in_micro_secs = 400;
|
||||
if (training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL)
|
||||
wait_in_micro_secs = training_rd_interval.bits.TRAINIG_AUX_RD_INTERVAL * 4000;
|
||||
}
|
||||
@@ -110,7 +113,6 @@ void decide_8b_10b_training_settings(
|
||||
*/
|
||||
lt_settings->link_settings.link_spread = link->dp_ss_off ?
|
||||
LINK_SPREAD_DISABLED : LINK_SPREAD_05_DOWNSPREAD_30KHZ;
|
||||
lt_settings->cr_pattern_time = get_cr_training_aux_rd_interval(link, link_setting);
|
||||
lt_settings->eq_pattern_time = get_eq_training_aux_rd_interval(link, link_setting);
|
||||
lt_settings->pattern_for_cr = decide_cr_training_pattern(link_setting);
|
||||
lt_settings->pattern_for_eq = decide_eq_training_pattern(link, link_setting);
|
||||
@@ -119,6 +121,7 @@ void decide_8b_10b_training_settings(
|
||||
lt_settings->disallow_per_lane_settings = true;
|
||||
lt_settings->always_match_dpcd_with_hw_lane_settings = true;
|
||||
lt_settings->lttpr_mode = dp_decide_8b_10b_lttpr_mode(link);
|
||||
lt_settings->cr_pattern_time = get_cr_training_aux_rd_interval(link, link_setting, lt_settings->lttpr_mode);
|
||||
dp_hw_to_dpcd_lane_settings(lt_settings, lt_settings->hw_lane_settings, lt_settings->dpcd_lane_settings);
|
||||
}
|
||||
|
||||
|
||||
@@ -2869,6 +2869,12 @@ struct dmub_cmd_psr_copy_settings_data {
|
||||
* Some panels request main link off before xth vertical line
|
||||
*/
|
||||
uint16_t poweroff_before_vertical_line;
|
||||
/**
|
||||
* Some panels cannot handle idle pattern during PSR entry.
|
||||
* To power down phy before disable stream to avoid sending
|
||||
* idle pattern.
|
||||
*/
|
||||
uint8_t power_down_phy_before_disable_stream;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -203,6 +203,10 @@
|
||||
#define mmDAGB0_WR_DATA_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB0_WR_MISC_CREDIT 0x0058
|
||||
#define mmDAGB0_WR_MISC_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE 0x005b
|
||||
#define mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1
|
||||
#define mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x005c
|
||||
#define mmDAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1
|
||||
#define mmDAGB0_WRCLI_ASK_PENDING 0x005d
|
||||
#define mmDAGB0_WRCLI_ASK_PENDING_BASE_IDX 1
|
||||
#define mmDAGB0_WRCLI_GO_PENDING 0x005e
|
||||
@@ -455,6 +459,10 @@
|
||||
#define mmDAGB1_WR_DATA_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB1_WR_MISC_CREDIT 0x00d8
|
||||
#define mmDAGB1_WR_MISC_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE 0x00db
|
||||
#define mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1
|
||||
#define mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x00dc
|
||||
#define mmDAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1
|
||||
#define mmDAGB1_WRCLI_ASK_PENDING 0x00dd
|
||||
#define mmDAGB1_WRCLI_ASK_PENDING_BASE_IDX 1
|
||||
#define mmDAGB1_WRCLI_GO_PENDING 0x00de
|
||||
@@ -707,6 +715,10 @@
|
||||
#define mmDAGB2_WR_DATA_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB2_WR_MISC_CREDIT 0x0158
|
||||
#define mmDAGB2_WR_MISC_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB2_WRCLI_GPU_SNOOP_OVERRIDE 0x015b
|
||||
#define mmDAGB2_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1
|
||||
#define mmDAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x015c
|
||||
#define mmDAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1
|
||||
#define mmDAGB2_WRCLI_ASK_PENDING 0x015d
|
||||
#define mmDAGB2_WRCLI_ASK_PENDING_BASE_IDX 1
|
||||
#define mmDAGB2_WRCLI_GO_PENDING 0x015e
|
||||
@@ -959,6 +971,10 @@
|
||||
#define mmDAGB3_WR_DATA_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB3_WR_MISC_CREDIT 0x01d8
|
||||
#define mmDAGB3_WR_MISC_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB3_WRCLI_GPU_SNOOP_OVERRIDE 0x01db
|
||||
#define mmDAGB3_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1
|
||||
#define mmDAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x01dc
|
||||
#define mmDAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1
|
||||
#define mmDAGB3_WRCLI_ASK_PENDING 0x01dd
|
||||
#define mmDAGB3_WRCLI_ASK_PENDING_BASE_IDX 1
|
||||
#define mmDAGB3_WRCLI_GO_PENDING 0x01de
|
||||
@@ -1211,6 +1227,10 @@
|
||||
#define mmDAGB4_WR_DATA_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB4_WR_MISC_CREDIT 0x0258
|
||||
#define mmDAGB4_WR_MISC_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB4_WRCLI_GPU_SNOOP_OVERRIDE 0x025b
|
||||
#define mmDAGB4_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1
|
||||
#define mmDAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x025c
|
||||
#define mmDAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1
|
||||
#define mmDAGB4_WRCLI_ASK_PENDING 0x025d
|
||||
#define mmDAGB4_WRCLI_ASK_PENDING_BASE_IDX 1
|
||||
#define mmDAGB4_WRCLI_GO_PENDING 0x025e
|
||||
@@ -4793,6 +4813,10 @@
|
||||
#define mmDAGB5_WR_DATA_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB5_WR_MISC_CREDIT 0x3058
|
||||
#define mmDAGB5_WR_MISC_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB5_WRCLI_GPU_SNOOP_OVERRIDE 0x305b
|
||||
#define mmDAGB5_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1
|
||||
#define mmDAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x305c
|
||||
#define mmDAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1
|
||||
#define mmDAGB5_WRCLI_ASK_PENDING 0x305d
|
||||
#define mmDAGB5_WRCLI_ASK_PENDING_BASE_IDX 1
|
||||
#define mmDAGB5_WRCLI_GO_PENDING 0x305e
|
||||
@@ -5045,6 +5069,10 @@
|
||||
#define mmDAGB6_WR_DATA_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB6_WR_MISC_CREDIT 0x30d8
|
||||
#define mmDAGB6_WR_MISC_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB6_WRCLI_GPU_SNOOP_OVERRIDE 0x30db
|
||||
#define mmDAGB6_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1
|
||||
#define mmDAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x30dc
|
||||
#define mmDAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1
|
||||
#define mmDAGB6_WRCLI_ASK_PENDING 0x30dd
|
||||
#define mmDAGB6_WRCLI_ASK_PENDING_BASE_IDX 1
|
||||
#define mmDAGB6_WRCLI_GO_PENDING 0x30de
|
||||
@@ -5297,6 +5325,10 @@
|
||||
#define mmDAGB7_WR_DATA_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB7_WR_MISC_CREDIT 0x3158
|
||||
#define mmDAGB7_WR_MISC_CREDIT_BASE_IDX 1
|
||||
#define mmDAGB7_WRCLI_GPU_SNOOP_OVERRIDE 0x315b
|
||||
#define mmDAGB7_WRCLI_GPU_SNOOP_OVERRIDE_BASE_IDX 1
|
||||
#define mmDAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE 0x315c
|
||||
#define mmDAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE_BASE_IDX 1
|
||||
#define mmDAGB7_WRCLI_ASK_PENDING 0x315d
|
||||
#define mmDAGB7_WRCLI_ASK_PENDING_BASE_IDX 1
|
||||
#define mmDAGB7_WRCLI_GO_PENDING 0x315e
|
||||
|
||||
@@ -1532,6 +1532,12 @@
|
||||
//DAGB0_WRCLI_DBUS_GO_PENDING
|
||||
#define DAGB0_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0
|
||||
#define DAGB0_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL
|
||||
//DAGB0_WRCLI_GPU_SNOOP_OVERRIDE
|
||||
#define DAGB0_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0
|
||||
#define DAGB0_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE
|
||||
#define DAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0
|
||||
#define DAGB0_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB0_DAGB_DLY
|
||||
#define DAGB0_DAGB_DLY__DLY__SHIFT 0x0
|
||||
#define DAGB0_DAGB_DLY__CLI__SHIFT 0x8
|
||||
@@ -3207,6 +3213,12 @@
|
||||
//DAGB1_WRCLI_DBUS_GO_PENDING
|
||||
#define DAGB1_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0
|
||||
#define DAGB1_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL
|
||||
//DAGB1_WRCLI_GPU_SNOOP_OVERRIDE
|
||||
#define DAGB1_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0
|
||||
#define DAGB1_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE
|
||||
#define DAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0
|
||||
#define DAGB1_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB1_DAGB_DLY
|
||||
#define DAGB1_DAGB_DLY__DLY__SHIFT 0x0
|
||||
#define DAGB1_DAGB_DLY__CLI__SHIFT 0x8
|
||||
@@ -4882,6 +4894,12 @@
|
||||
//DAGB2_WRCLI_DBUS_GO_PENDING
|
||||
#define DAGB2_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0
|
||||
#define DAGB2_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL
|
||||
//DAGB2_WRCLI_GPU_SNOOP_OVERRIDE
|
||||
#define DAGB2_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0
|
||||
#define DAGB2_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE
|
||||
#define DAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0
|
||||
#define DAGB2_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB2_DAGB_DLY
|
||||
#define DAGB2_DAGB_DLY__DLY__SHIFT 0x0
|
||||
#define DAGB2_DAGB_DLY__CLI__SHIFT 0x8
|
||||
@@ -6557,6 +6575,12 @@
|
||||
//DAGB3_WRCLI_DBUS_GO_PENDING
|
||||
#define DAGB3_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0
|
||||
#define DAGB3_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL
|
||||
//DAGB3_WRCLI_GPU_SNOOP_OVERRIDE
|
||||
#define DAGB3_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0
|
||||
#define DAGB3_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE
|
||||
#define DAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0
|
||||
#define DAGB3_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB3_DAGB_DLY
|
||||
#define DAGB3_DAGB_DLY__DLY__SHIFT 0x0
|
||||
#define DAGB3_DAGB_DLY__CLI__SHIFT 0x8
|
||||
@@ -8232,6 +8256,12 @@
|
||||
//DAGB4_WRCLI_DBUS_GO_PENDING
|
||||
#define DAGB4_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0
|
||||
#define DAGB4_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL
|
||||
//DAGB4_WRCLI_GPU_SNOOP_OVERRIDE
|
||||
#define DAGB4_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0
|
||||
#define DAGB4_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE
|
||||
#define DAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0
|
||||
#define DAGB4_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB4_DAGB_DLY
|
||||
#define DAGB4_DAGB_DLY__DLY__SHIFT 0x0
|
||||
#define DAGB4_DAGB_DLY__CLI__SHIFT 0x8
|
||||
@@ -28737,6 +28767,12 @@
|
||||
//DAGB5_WRCLI_DBUS_GO_PENDING
|
||||
#define DAGB5_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0
|
||||
#define DAGB5_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL
|
||||
//DAGB5_WRCLI_GPU_SNOOP_OVERRIDE
|
||||
#define DAGB5_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0
|
||||
#define DAGB5_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE
|
||||
#define DAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0
|
||||
#define DAGB5_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB5_DAGB_DLY
|
||||
#define DAGB5_DAGB_DLY__DLY__SHIFT 0x0
|
||||
#define DAGB5_DAGB_DLY__CLI__SHIFT 0x8
|
||||
@@ -30412,6 +30448,12 @@
|
||||
//DAGB6_WRCLI_DBUS_GO_PENDING
|
||||
#define DAGB6_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0
|
||||
#define DAGB6_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL
|
||||
//DAGB6_WRCLI_GPU_SNOOP_OVERRIDE
|
||||
#define DAGB6_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0
|
||||
#define DAGB6_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE
|
||||
#define DAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0
|
||||
#define DAGB6_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB6_DAGB_DLY
|
||||
#define DAGB6_DAGB_DLY__DLY__SHIFT 0x0
|
||||
#define DAGB6_DAGB_DLY__CLI__SHIFT 0x8
|
||||
@@ -32087,6 +32129,12 @@
|
||||
//DAGB7_WRCLI_DBUS_GO_PENDING
|
||||
#define DAGB7_WRCLI_DBUS_GO_PENDING__BUSY__SHIFT 0x0
|
||||
#define DAGB7_WRCLI_DBUS_GO_PENDING__BUSY_MASK 0xFFFFFFFFL
|
||||
//DAGB7_WRCLI_GPU_SNOOP_OVERRIDE
|
||||
#define DAGB7_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE__SHIFT 0x0
|
||||
#define DAGB7_WRCLI_GPU_SNOOP_OVERRIDE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE
|
||||
#define DAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE__SHIFT 0x0
|
||||
#define DAGB7_WRCLI_GPU_SNOOP_OVERRIDE_VALUE__ENABLE_MASK 0xFFFFFFFFL
|
||||
//DAGB7_DAGB_DLY
|
||||
#define DAGB7_DAGB_DLY__DLY__SHIFT 0x0
|
||||
#define DAGB7_DAGB_DLY__CLI__SHIFT 0x8
|
||||
|
||||
@@ -275,8 +275,9 @@ static int smu_v13_0_6_init_microcode(struct smu_context *smu)
|
||||
int var = (adev->pdev->device & 0xF);
|
||||
char ucode_prefix[15];
|
||||
|
||||
/* No need to load P2S tables in IOV mode */
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
/* No need to load P2S tables in IOV mode or for smu v13.0.12 */
|
||||
if (amdgpu_sriov_vf(adev) ||
|
||||
(amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 12)))
|
||||
return 0;
|
||||
|
||||
if (!(adev->flags & AMD_IS_APU)) {
|
||||
|
||||
@@ -286,11 +286,21 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
v3d->clk = devm_clk_get_optional(dev, NULL);
|
||||
if (IS_ERR(v3d->clk))
|
||||
return dev_err_probe(dev, PTR_ERR(v3d->clk), "Failed to get V3D clock\n");
|
||||
|
||||
ret = clk_prepare_enable(v3d->clk);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Couldn't enable the V3D clock\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
mmu_debug = V3D_READ(V3D_MMU_DEBUG_INFO);
|
||||
mask = DMA_BIT_MASK(30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_PA_WIDTH));
|
||||
ret = dma_set_mask_and_coherent(dev, mask);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto clk_disable;
|
||||
|
||||
v3d->va_width = 30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_VA_WIDTH);
|
||||
|
||||
@@ -310,28 +320,29 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
|
||||
ret = PTR_ERR(v3d->reset);
|
||||
|
||||
if (ret == -EPROBE_DEFER)
|
||||
return ret;
|
||||
goto clk_disable;
|
||||
|
||||
v3d->reset = NULL;
|
||||
ret = map_regs(v3d, &v3d->bridge_regs, "bridge");
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"Failed to get reset control or bridge regs\n");
|
||||
return ret;
|
||||
goto clk_disable;
|
||||
}
|
||||
}
|
||||
|
||||
if (v3d->ver < 41) {
|
||||
ret = map_regs(v3d, &v3d->gca_regs, "gca");
|
||||
if (ret)
|
||||
return ret;
|
||||
goto clk_disable;
|
||||
}
|
||||
|
||||
v3d->mmu_scratch = dma_alloc_wc(dev, 4096, &v3d->mmu_scratch_paddr,
|
||||
GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO);
|
||||
if (!v3d->mmu_scratch) {
|
||||
dev_err(dev, "Failed to allocate MMU scratch page\n");
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto clk_disable;
|
||||
}
|
||||
|
||||
ret = v3d_gem_init(drm);
|
||||
@@ -360,6 +371,8 @@ gem_destroy:
|
||||
v3d_gem_destroy(drm);
|
||||
dma_free:
|
||||
dma_free_wc(dev, 4096, v3d->mmu_scratch, v3d->mmu_scratch_paddr);
|
||||
clk_disable:
|
||||
clk_disable_unprepare(v3d->clk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -377,6 +390,8 @@ static void v3d_platform_drm_remove(struct platform_device *pdev)
|
||||
|
||||
dma_free_wc(v3d->drm.dev, 4096, v3d->mmu_scratch,
|
||||
v3d->mmu_scratch_paddr);
|
||||
|
||||
clk_disable_unprepare(v3d->clk);
|
||||
}
|
||||
|
||||
static struct platform_driver v3d_platform_driver = {
|
||||
|
||||
@@ -105,7 +105,7 @@ struct xgene_hwmon_dev {
|
||||
|
||||
phys_addr_t comm_base_addr;
|
||||
void *pcc_comm_addr;
|
||||
u64 usecs_lat;
|
||||
unsigned int usecs_lat;
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -98,6 +98,9 @@ struct ad7944_chip_info {
|
||||
const struct iio_chan_spec channels[2];
|
||||
};
|
||||
|
||||
/* get number of bytes for SPI xfer */
|
||||
#define AD7944_SPI_BYTES(scan_type) ((scan_type).realbits > 16 ? 4 : 2)
|
||||
|
||||
/*
|
||||
* AD7944_DEFINE_CHIP_INFO - Define a chip info structure for a specific chip
|
||||
* @_name: The name of the chip
|
||||
@@ -164,7 +167,7 @@ static int ad7944_3wire_cs_mode_init_msg(struct device *dev, struct ad7944_adc *
|
||||
|
||||
/* Then we can read the data during the acquisition phase */
|
||||
xfers[2].rx_buf = &adc->sample.raw;
|
||||
xfers[2].len = BITS_TO_BYTES(chan->scan_type.storagebits);
|
||||
xfers[2].len = AD7944_SPI_BYTES(chan->scan_type);
|
||||
xfers[2].bits_per_word = chan->scan_type.realbits;
|
||||
|
||||
spi_message_init_with_transfers(&adc->msg, xfers, 3);
|
||||
@@ -193,7 +196,7 @@ static int ad7944_4wire_mode_init_msg(struct device *dev, struct ad7944_adc *adc
|
||||
xfers[0].delay.unit = SPI_DELAY_UNIT_NSECS;
|
||||
|
||||
xfers[1].rx_buf = &adc->sample.raw;
|
||||
xfers[1].len = BITS_TO_BYTES(chan->scan_type.storagebits);
|
||||
xfers[1].len = AD7944_SPI_BYTES(chan->scan_type);
|
||||
xfers[1].bits_per_word = chan->scan_type.realbits;
|
||||
|
||||
spi_message_init_with_transfers(&adc->msg, xfers, 2);
|
||||
@@ -228,7 +231,7 @@ static int ad7944_chain_mode_init_msg(struct device *dev, struct ad7944_adc *adc
|
||||
xfers[0].delay.unit = SPI_DELAY_UNIT_NSECS;
|
||||
|
||||
xfers[1].rx_buf = adc->chain_mode_buf;
|
||||
xfers[1].len = BITS_TO_BYTES(chan->scan_type.storagebits) * n_chain_dev;
|
||||
xfers[1].len = AD7944_SPI_BYTES(chan->scan_type) * n_chain_dev;
|
||||
xfers[1].bits_per_word = chan->scan_type.realbits;
|
||||
|
||||
spi_message_init_with_transfers(&adc->msg, xfers, 2);
|
||||
@@ -274,12 +277,12 @@ static int ad7944_single_conversion(struct ad7944_adc *adc,
|
||||
return ret;
|
||||
|
||||
if (adc->spi_mode == AD7944_SPI_MODE_CHAIN) {
|
||||
if (chan->scan_type.storagebits > 16)
|
||||
if (chan->scan_type.realbits > 16)
|
||||
*val = ((u32 *)adc->chain_mode_buf)[chan->scan_index];
|
||||
else
|
||||
*val = ((u16 *)adc->chain_mode_buf)[chan->scan_index];
|
||||
} else {
|
||||
if (chan->scan_type.storagebits > 16)
|
||||
if (chan->scan_type.realbits > 16)
|
||||
*val = adc->sample.raw.u32;
|
||||
else
|
||||
*val = adc->sample.raw.u16;
|
||||
@@ -409,8 +412,7 @@ static int ad7944_chain_mode_alloc(struct device *dev,
|
||||
/* 1 word for each voltage channel + aligned u64 for timestamp */
|
||||
|
||||
chain_mode_buf_size = ALIGN(n_chain_dev *
|
||||
BITS_TO_BYTES(chan[0].scan_type.storagebits), sizeof(u64))
|
||||
+ sizeof(u64);
|
||||
AD7944_SPI_BYTES(chan[0].scan_type), sizeof(u64)) + sizeof(u64);
|
||||
buf = devm_kzalloc(dev, chain_mode_buf_size, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -68,6 +68,7 @@ struct led_netdev_data {
|
||||
unsigned int last_activity;
|
||||
|
||||
unsigned long mode;
|
||||
unsigned long blink_delay;
|
||||
int link_speed;
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported_link_modes);
|
||||
u8 duplex;
|
||||
@@ -86,6 +87,10 @@ static void set_baseline_state(struct led_netdev_data *trigger_data)
|
||||
/* Already validated, hw control is possible with the requested mode */
|
||||
if (trigger_data->hw_control) {
|
||||
led_cdev->hw_control_set(led_cdev, trigger_data->mode);
|
||||
if (led_cdev->blink_set) {
|
||||
led_cdev->blink_set(led_cdev, &trigger_data->blink_delay,
|
||||
&trigger_data->blink_delay);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -454,10 +459,11 @@ static ssize_t interval_store(struct device *dev,
|
||||
size_t size)
|
||||
{
|
||||
struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev);
|
||||
struct led_classdev *led_cdev = trigger_data->led_cdev;
|
||||
unsigned long value;
|
||||
int ret;
|
||||
|
||||
if (trigger_data->hw_control)
|
||||
if (trigger_data->hw_control && !led_cdev->blink_set)
|
||||
return -EINVAL;
|
||||
|
||||
ret = kstrtoul(buf, 0, &value);
|
||||
@@ -466,9 +472,13 @@ static ssize_t interval_store(struct device *dev,
|
||||
|
||||
/* impose some basic bounds on the timer interval */
|
||||
if (value >= 5 && value <= 10000) {
|
||||
cancel_delayed_work_sync(&trigger_data->work);
|
||||
if (trigger_data->hw_control) {
|
||||
trigger_data->blink_delay = value;
|
||||
} else {
|
||||
cancel_delayed_work_sync(&trigger_data->work);
|
||||
|
||||
atomic_set(&trigger_data->interval, msecs_to_jiffies(value));
|
||||
atomic_set(&trigger_data->interval, msecs_to_jiffies(value));
|
||||
}
|
||||
set_baseline_state(trigger_data); /* resets timer */
|
||||
}
|
||||
|
||||
|
||||
@@ -1098,6 +1098,29 @@ static void fec_enet_enable_ring(struct net_device *ndev)
|
||||
}
|
||||
}
|
||||
|
||||
/* Whack a reset. We should wait for this.
|
||||
* For i.MX6SX SOC, enet use AXI bus, we use disable MAC
|
||||
* instead of reset MAC itself.
|
||||
*/
|
||||
static void fec_ctrl_reset(struct fec_enet_private *fep, bool allow_wol)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
if (!allow_wol || !(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) {
|
||||
if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES ||
|
||||
((fep->quirks & FEC_QUIRK_NO_HARD_RESET) && fep->link)) {
|
||||
writel(0, fep->hwp + FEC_ECNTRL);
|
||||
} else {
|
||||
writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL);
|
||||
udelay(10);
|
||||
}
|
||||
} else {
|
||||
val = readl(fep->hwp + FEC_ECNTRL);
|
||||
val |= (FEC_ECR_MAGICEN | FEC_ECR_SLEEP);
|
||||
writel(val, fep->hwp + FEC_ECNTRL);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is called to start or restart the FEC during a link
|
||||
* change, transmit timeout, or to reconfigure the FEC. The network
|
||||
@@ -1114,17 +1137,7 @@ fec_restart(struct net_device *ndev)
|
||||
if (fep->bufdesc_ex)
|
||||
fec_ptp_save_state(fep);
|
||||
|
||||
/* Whack a reset. We should wait for this.
|
||||
* For i.MX6SX SOC, enet use AXI bus, we use disable MAC
|
||||
* instead of reset MAC itself.
|
||||
*/
|
||||
if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES ||
|
||||
((fep->quirks & FEC_QUIRK_NO_HARD_RESET) && fep->link)) {
|
||||
writel(0, fep->hwp + FEC_ECNTRL);
|
||||
} else {
|
||||
writel(1, fep->hwp + FEC_ECNTRL);
|
||||
udelay(10);
|
||||
}
|
||||
fec_ctrl_reset(fep, false);
|
||||
|
||||
/*
|
||||
* enet-mac reset will reset mac address registers too,
|
||||
@@ -1378,22 +1391,7 @@ fec_stop(struct net_device *ndev)
|
||||
if (fep->bufdesc_ex)
|
||||
fec_ptp_save_state(fep);
|
||||
|
||||
/* Whack a reset. We should wait for this.
|
||||
* For i.MX6SX SOC, enet use AXI bus, we use disable MAC
|
||||
* instead of reset MAC itself.
|
||||
*/
|
||||
if (!(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) {
|
||||
if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES) {
|
||||
writel(0, fep->hwp + FEC_ECNTRL);
|
||||
} else {
|
||||
writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL);
|
||||
udelay(10);
|
||||
}
|
||||
} else {
|
||||
val = readl(fep->hwp + FEC_ECNTRL);
|
||||
val |= (FEC_ECR_MAGICEN | FEC_ECR_SLEEP);
|
||||
writel(val, fep->hwp + FEC_ECNTRL);
|
||||
}
|
||||
fec_ctrl_reset(fep, true);
|
||||
writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED);
|
||||
writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK);
|
||||
|
||||
|
||||
@@ -94,8 +94,6 @@ struct page_pool;
|
||||
#define MLX5_MPWRQ_DEF_LOG_STRIDE_SZ(mdev) \
|
||||
MLX5_MPWRQ_LOG_STRIDE_SZ(mdev, order_base_2(MLX5E_RX_MAX_HEAD))
|
||||
|
||||
#define MLX5_MPWRQ_MAX_LOG_WQE_SZ 18
|
||||
|
||||
/* Keep in sync with mlx5e_mpwrq_log_wqe_sz.
|
||||
* These are theoretical maximums, which can be further restricted by
|
||||
* capabilities. These values are used for static resource allocations and
|
||||
@@ -385,7 +383,6 @@ enum {
|
||||
MLX5E_SQ_STATE_VLAN_NEED_L2_INLINE,
|
||||
MLX5E_SQ_STATE_PENDING_XSK_TX,
|
||||
MLX5E_SQ_STATE_PENDING_TLS_RX_RESYNC,
|
||||
MLX5E_SQ_STATE_XDP_MULTIBUF,
|
||||
MLX5E_NUM_SQ_STATES, /* Must be kept last */
|
||||
};
|
||||
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
#include <net/page_pool/types.h>
|
||||
#include <net/xdp_sock_drv.h>
|
||||
|
||||
#define MLX5_MPWRQ_MAX_LOG_WQE_SZ 18
|
||||
#define MLX5_REP_MPWRQ_MAX_LOG_WQE_SZ 17
|
||||
|
||||
static u8 mlx5e_mpwrq_min_page_shift(struct mlx5_core_dev *mdev)
|
||||
{
|
||||
u8 min_page_shift = MLX5_CAP_GEN_2(mdev, log_min_mkey_entity_size);
|
||||
@@ -103,18 +106,22 @@ u8 mlx5e_mpwrq_log_wqe_sz(struct mlx5_core_dev *mdev, u8 page_shift,
|
||||
enum mlx5e_mpwrq_umr_mode umr_mode)
|
||||
{
|
||||
u8 umr_entry_size = mlx5e_mpwrq_umr_entry_size(umr_mode);
|
||||
u8 max_pages_per_wqe, max_log_mpwqe_size;
|
||||
u8 max_pages_per_wqe, max_log_wqe_size_calc;
|
||||
u8 max_log_wqe_size_cap;
|
||||
u16 max_wqe_size;
|
||||
|
||||
/* Keep in sync with MLX5_MPWRQ_MAX_PAGES_PER_WQE. */
|
||||
max_wqe_size = mlx5e_get_max_sq_aligned_wqebbs(mdev) * MLX5_SEND_WQE_BB;
|
||||
max_pages_per_wqe = ALIGN_DOWN(max_wqe_size - sizeof(struct mlx5e_umr_wqe),
|
||||
MLX5_UMR_FLEX_ALIGNMENT) / umr_entry_size;
|
||||
max_log_mpwqe_size = ilog2(max_pages_per_wqe) + page_shift;
|
||||
max_log_wqe_size_calc = ilog2(max_pages_per_wqe) + page_shift;
|
||||
|
||||
WARN_ON_ONCE(max_log_mpwqe_size < MLX5E_ORDER2_MAX_PACKET_MTU);
|
||||
WARN_ON_ONCE(max_log_wqe_size_calc < MLX5E_ORDER2_MAX_PACKET_MTU);
|
||||
|
||||
return min_t(u8, max_log_mpwqe_size, MLX5_MPWRQ_MAX_LOG_WQE_SZ);
|
||||
max_log_wqe_size_cap = mlx5_core_is_ecpf(mdev) ?
|
||||
MLX5_REP_MPWRQ_MAX_LOG_WQE_SZ : MLX5_MPWRQ_MAX_LOG_WQE_SZ;
|
||||
|
||||
return min_t(u8, max_log_wqe_size_calc, max_log_wqe_size_cap);
|
||||
}
|
||||
|
||||
u8 mlx5e_mpwrq_pages_per_wqe(struct mlx5_core_dev *mdev, u8 page_shift,
|
||||
@@ -1242,7 +1249,6 @@ void mlx5e_build_xdpsq_param(struct mlx5_core_dev *mdev,
|
||||
mlx5e_build_sq_param_common(mdev, param);
|
||||
MLX5_SET(wq, wq, log_wq_sz, params->log_sq_size);
|
||||
param->is_mpw = MLX5E_GET_PFLAG(params, MLX5E_PFLAG_XDP_TX_MPWQE);
|
||||
param->is_xdp_mb = !mlx5e_rx_is_linear_skb(mdev, params, xsk);
|
||||
mlx5e_build_tx_cq_param(mdev, params, ¶m->cqp);
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,6 @@ struct mlx5e_sq_param {
|
||||
struct mlx5_wq_param wq;
|
||||
bool is_mpw;
|
||||
bool is_tls;
|
||||
bool is_xdp_mb;
|
||||
u16 stop_room;
|
||||
};
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@ static const char * const sq_sw_state_type_name[] = {
|
||||
[MLX5E_SQ_STATE_VLAN_NEED_L2_INLINE] = "vlan_need_l2_inline",
|
||||
[MLX5E_SQ_STATE_PENDING_XSK_TX] = "pending_xsk_tx",
|
||||
[MLX5E_SQ_STATE_PENDING_TLS_RX_RESYNC] = "pending_tls_rx_resync",
|
||||
[MLX5E_SQ_STATE_XDP_MULTIBUF] = "xdp_multibuf",
|
||||
};
|
||||
|
||||
static int mlx5e_wait_for_sq_flush(struct mlx5e_txqsq *sq)
|
||||
|
||||
@@ -546,6 +546,7 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xmit_data *xdptxd,
|
||||
bool inline_ok;
|
||||
bool linear;
|
||||
u16 pi;
|
||||
int i;
|
||||
|
||||
struct mlx5e_xdpsq_stats *stats = sq->stats;
|
||||
|
||||
@@ -612,42 +613,34 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xmit_data *xdptxd,
|
||||
|
||||
cseg->opmod_idx_opcode = cpu_to_be32((sq->pc << 8) | MLX5_OPCODE_SEND);
|
||||
|
||||
if (test_bit(MLX5E_SQ_STATE_XDP_MULTIBUF, &sq->state)) {
|
||||
int i;
|
||||
memset(&cseg->trailer, 0, sizeof(cseg->trailer));
|
||||
memset(eseg, 0, sizeof(*eseg) - sizeof(eseg->trailer));
|
||||
|
||||
memset(&cseg->trailer, 0, sizeof(cseg->trailer));
|
||||
memset(eseg, 0, sizeof(*eseg) - sizeof(eseg->trailer));
|
||||
eseg->inline_hdr.sz = cpu_to_be16(inline_hdr_sz);
|
||||
|
||||
eseg->inline_hdr.sz = cpu_to_be16(inline_hdr_sz);
|
||||
for (i = 0; i < num_frags; i++) {
|
||||
skb_frag_t *frag = &xdptxdf->sinfo->frags[i];
|
||||
dma_addr_t addr;
|
||||
|
||||
for (i = 0; i < num_frags; i++) {
|
||||
skb_frag_t *frag = &xdptxdf->sinfo->frags[i];
|
||||
dma_addr_t addr;
|
||||
addr = xdptxdf->dma_arr ? xdptxdf->dma_arr[i] :
|
||||
page_pool_get_dma_addr(skb_frag_page(frag)) +
|
||||
skb_frag_off(frag);
|
||||
|
||||
addr = xdptxdf->dma_arr ? xdptxdf->dma_arr[i] :
|
||||
page_pool_get_dma_addr(skb_frag_page(frag)) +
|
||||
skb_frag_off(frag);
|
||||
|
||||
dseg->addr = cpu_to_be64(addr);
|
||||
dseg->byte_count = cpu_to_be32(skb_frag_size(frag));
|
||||
dseg->lkey = sq->mkey_be;
|
||||
dseg++;
|
||||
}
|
||||
|
||||
cseg->qpn_ds = cpu_to_be32((sq->sqn << 8) | ds_cnt);
|
||||
|
||||
sq->db.wqe_info[pi] = (struct mlx5e_xdp_wqe_info) {
|
||||
.num_wqebbs = num_wqebbs,
|
||||
.num_pkts = 1,
|
||||
};
|
||||
|
||||
sq->pc += num_wqebbs;
|
||||
} else {
|
||||
cseg->fm_ce_se = 0;
|
||||
|
||||
sq->pc++;
|
||||
dseg->addr = cpu_to_be64(addr);
|
||||
dseg->byte_count = cpu_to_be32(skb_frag_size(frag));
|
||||
dseg->lkey = sq->mkey_be;
|
||||
dseg++;
|
||||
}
|
||||
|
||||
cseg->qpn_ds = cpu_to_be32((sq->sqn << 8) | ds_cnt);
|
||||
|
||||
sq->db.wqe_info[pi] = (struct mlx5e_xdp_wqe_info) {
|
||||
.num_wqebbs = num_wqebbs,
|
||||
.num_pkts = 1,
|
||||
};
|
||||
|
||||
sq->pc += num_wqebbs;
|
||||
|
||||
xsk_tx_metadata_request(meta, &mlx5e_xsk_tx_metadata_ops, eseg);
|
||||
|
||||
sq->doorbell_cseg = cseg;
|
||||
|
||||
@@ -2030,41 +2030,12 @@ int mlx5e_open_xdpsq(struct mlx5e_channel *c, struct mlx5e_params *params,
|
||||
csp.min_inline_mode = sq->min_inline_mode;
|
||||
set_bit(MLX5E_SQ_STATE_ENABLED, &sq->state);
|
||||
|
||||
if (param->is_xdp_mb)
|
||||
set_bit(MLX5E_SQ_STATE_XDP_MULTIBUF, &sq->state);
|
||||
|
||||
err = mlx5e_create_sq_rdy(c->mdev, param, &csp, 0, &sq->sqn);
|
||||
if (err)
|
||||
goto err_free_xdpsq;
|
||||
|
||||
mlx5e_set_xmit_fp(sq, param->is_mpw);
|
||||
|
||||
if (!param->is_mpw && !test_bit(MLX5E_SQ_STATE_XDP_MULTIBUF, &sq->state)) {
|
||||
unsigned int ds_cnt = MLX5E_TX_WQE_EMPTY_DS_COUNT + 1;
|
||||
unsigned int inline_hdr_sz = 0;
|
||||
int i;
|
||||
|
||||
if (sq->min_inline_mode != MLX5_INLINE_MODE_NONE) {
|
||||
inline_hdr_sz = MLX5E_XDP_MIN_INLINE;
|
||||
ds_cnt++;
|
||||
}
|
||||
|
||||
/* Pre initialize fixed WQE fields */
|
||||
for (i = 0; i < mlx5_wq_cyc_get_size(&sq->wq); i++) {
|
||||
struct mlx5e_tx_wqe *wqe = mlx5_wq_cyc_get_wqe(&sq->wq, i);
|
||||
struct mlx5_wqe_ctrl_seg *cseg = &wqe->ctrl;
|
||||
struct mlx5_wqe_eth_seg *eseg = &wqe->eth;
|
||||
|
||||
sq->db.wqe_info[i] = (struct mlx5e_xdp_wqe_info) {
|
||||
.num_wqebbs = 1,
|
||||
.num_pkts = 1,
|
||||
};
|
||||
|
||||
cseg->qpn_ds = cpu_to_be32((sq->sqn << 8) | ds_cnt);
|
||||
eseg->inline_hdr.sz = cpu_to_be16(inline_hdr_sz);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_xdpsq:
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
#define MLX5E_REP_PARAMS_DEF_LOG_SQ_SIZE \
|
||||
max(0x7, MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE)
|
||||
#define MLX5E_REP_PARAMS_DEF_NUM_CHANNELS 1
|
||||
#define MLX5E_REP_PARAMS_DEF_LOG_RQ_SIZE 0x8
|
||||
|
||||
static const char mlx5e_rep_driver_name[] = "mlx5e_rep";
|
||||
|
||||
@@ -854,6 +855,8 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
|
||||
|
||||
/* RQ */
|
||||
mlx5e_build_rq_params(mdev, params);
|
||||
if (!mlx5e_is_uplink_rep(priv) && mlx5_core_is_ecpf(mdev))
|
||||
params->log_rq_mtu_frames = MLX5E_REP_PARAMS_DEF_LOG_RQ_SIZE;
|
||||
|
||||
/* If netdev is already registered (e.g. move from nic profile to uplink,
|
||||
* RTNL lock must be held before triggering netdev notifiers.
|
||||
@@ -885,6 +888,8 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev,
|
||||
netdev->ethtool_ops = &mlx5e_rep_ethtool_ops;
|
||||
|
||||
netdev->watchdog_timeo = 15 * HZ;
|
||||
if (mlx5_core_is_ecpf(mdev))
|
||||
netdev->tx_queue_len = 1 << MLX5E_REP_PARAMS_DEF_LOG_SQ_SIZE;
|
||||
|
||||
#if IS_ENABLED(CONFIG_MLX5_CLS_ACT)
|
||||
netdev->hw_features |= NETIF_F_HW_TC;
|
||||
|
||||
@@ -166,6 +166,9 @@ mlx5e_test_loopback_validate(struct sk_buff *skb,
|
||||
struct udphdr *udph;
|
||||
struct iphdr *iph;
|
||||
|
||||
if (skb_linearize(skb))
|
||||
goto out;
|
||||
|
||||
/* We are only going to peek, no need to clone the SKB */
|
||||
if (MLX5E_TEST_PKT_SIZE - ETH_HLEN > skb_headlen(skb))
|
||||
goto out;
|
||||
|
||||
@@ -10085,6 +10085,7 @@ static const struct usb_device_id rtl8152_table[] = {
|
||||
{ USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) },
|
||||
{ USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) },
|
||||
{ USB_DEVICE(VENDOR_ID_DLINK, 0xb301) },
|
||||
{ USB_DEVICE(VENDOR_ID_DELL, 0xb097) },
|
||||
{ USB_DEVICE(VENDOR_ID_ASUS, 0x1976) },
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
/*
|
||||
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include "dp_mon.h"
|
||||
@@ -666,6 +666,11 @@ ath12k_dp_mon_rx_parse_status_tlv(struct ath12k_base *ab,
|
||||
if (userid < HAL_MAX_UL_MU_USERS) {
|
||||
struct hal_rx_user_status *rxuser_stats =
|
||||
&ppdu_info->userstats[userid];
|
||||
|
||||
if (ppdu_info->num_mpdu_fcs_ok > 1 ||
|
||||
ppdu_info->num_mpdu_fcs_err > 1)
|
||||
ppdu_info->userstats[userid].ampdu_present = true;
|
||||
|
||||
ppdu_info->num_users += 1;
|
||||
|
||||
ath12k_dp_mon_rx_handle_ofdma_info(tlv_data, rxuser_stats);
|
||||
@@ -783,8 +788,8 @@ ath12k_dp_mon_rx_parse_status_tlv(struct ath12k_base *ab,
|
||||
if (userid < HAL_MAX_UL_MU_USERS) {
|
||||
info[0] = __le32_to_cpu(mpdu_start->info0);
|
||||
ppdu_info->userid = userid;
|
||||
ppdu_info->ampdu_id[userid] =
|
||||
u32_get_bits(info[0], HAL_RX_MPDU_START_INFO1_PEERID);
|
||||
ppdu_info->userstats[userid].ampdu_id =
|
||||
u32_get_bits(info[0], HAL_RX_MPDU_START_INFO0_PPDU_ID);
|
||||
}
|
||||
|
||||
mon_mpdu = kzalloc(sizeof(*mon_mpdu), GFP_ATOMIC);
|
||||
@@ -1020,15 +1025,14 @@ static void ath12k_dp_mon_update_radiotap(struct ath12k *ar,
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
u8 *ptr = NULL;
|
||||
u16 ampdu_id = ppduinfo->ampdu_id[ppduinfo->userid];
|
||||
|
||||
rxs->flag |= RX_FLAG_MACTIME_START;
|
||||
rxs->signal = ppduinfo->rssi_comb + ATH12K_DEFAULT_NOISE_FLOOR;
|
||||
rxs->nss = ppduinfo->nss + 1;
|
||||
|
||||
if (ampdu_id) {
|
||||
if (ppduinfo->userstats[ppduinfo->userid].ampdu_present) {
|
||||
rxs->flag |= RX_FLAG_AMPDU_DETAILS;
|
||||
rxs->ampdu_reference = ampdu_id;
|
||||
rxs->ampdu_reference = ppduinfo->userstats[ppduinfo->userid].ampdu_id;
|
||||
}
|
||||
|
||||
if (ppduinfo->he_mu_flags) {
|
||||
|
||||
@@ -143,6 +143,8 @@ struct hal_rx_user_status {
|
||||
u32 mpdu_fcs_ok_bitmap[HAL_RX_NUM_WORDS_PER_PPDU_BITMAP];
|
||||
u32 mpdu_ok_byte_count;
|
||||
u32 mpdu_err_byte_count;
|
||||
bool ampdu_present;
|
||||
u16 ampdu_id;
|
||||
};
|
||||
|
||||
#define HAL_MAX_UL_MU_USERS 37
|
||||
@@ -226,7 +228,6 @@ struct hal_rx_mon_ppdu_info {
|
||||
u8 addr4[ETH_ALEN];
|
||||
struct hal_rx_user_status userstats[HAL_MAX_UL_MU_USERS];
|
||||
u8 userid;
|
||||
u16 ampdu_id[HAL_MAX_UL_MU_USERS];
|
||||
bool first_msdu_in_mpdu;
|
||||
bool is_ampdu;
|
||||
u8 medium_prot_type;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2005-2014, 2018-2024 Intel Corporation
|
||||
* Copyright (C) 2005-2014, 2018-2025 Intel Corporation
|
||||
* Copyright (C) 2013-2015 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2015-2017 Intel Deutschland GmbH
|
||||
*/
|
||||
@@ -2691,7 +2691,7 @@ static u32 iwl_dump_ini_trigger(struct iwl_fw_runtime *fwrt,
|
||||
}
|
||||
/* collect DRAM_IMR region in the last */
|
||||
if (imr_reg_data.reg_tlv)
|
||||
size += iwl_dump_ini_mem(fwrt, list, ®_data,
|
||||
size += iwl_dump_ini_mem(fwrt, list, &imr_reg_data,
|
||||
&iwl_dump_ini_region_ops[IWL_FW_INI_REGION_DRAM_IMR]);
|
||||
|
||||
if (size) {
|
||||
|
||||
@@ -454,6 +454,9 @@ IWL_EXPORT_SYMBOL(iwl_trans_txq_enable_cfg);
|
||||
|
||||
int iwl_trans_wait_txq_empty(struct iwl_trans *trans, int queue)
|
||||
{
|
||||
if (unlikely(test_bit(STATUS_FW_ERROR, &trans->status)))
|
||||
return -EIO;
|
||||
|
||||
if (WARN_ONCE(trans->state != IWL_TRANS_FW_ALIVE,
|
||||
"bad state = %d\n", trans->state))
|
||||
return -EIO;
|
||||
|
||||
@@ -783,7 +783,8 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev,
|
||||
if (!check_firmware_size(data, size))
|
||||
return -EINVAL;
|
||||
|
||||
if (!ltecoex_read_reg(rtwdev, 0x38, <ecoex_bckp))
|
||||
if (rtwdev->chip->ltecoex_addr &&
|
||||
!ltecoex_read_reg(rtwdev, 0x38, <ecoex_bckp))
|
||||
return -EBUSY;
|
||||
|
||||
wlan_cpu_enable(rtwdev, false);
|
||||
@@ -801,7 +802,8 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev,
|
||||
|
||||
wlan_cpu_enable(rtwdev, true);
|
||||
|
||||
if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) {
|
||||
if (rtwdev->chip->ltecoex_addr &&
|
||||
!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) {
|
||||
ret = -EBUSY;
|
||||
goto dlfw_fail;
|
||||
}
|
||||
|
||||
@@ -109,6 +109,7 @@
|
||||
#define BIT_SHIFT_ROM_PGE 16
|
||||
#define BIT_FW_INIT_RDY BIT(15)
|
||||
#define BIT_FW_DW_RDY BIT(14)
|
||||
#define BIT_CPU_CLK_SEL (BIT(12) | BIT(13))
|
||||
#define BIT_RPWM_TOGGLE BIT(7)
|
||||
#define BIT_RAM_DL_SEL BIT(7) /* legacy only */
|
||||
#define BIT_DMEM_CHKSUM_OK BIT(6)
|
||||
@@ -126,7 +127,7 @@
|
||||
BIT_CHECK_SUM_OK)
|
||||
#define FW_READY_LEGACY (BIT_MCUFWDL_RDY | BIT_FWDL_CHK_RPT | \
|
||||
BIT_WINTINI_RDY | BIT_RAM_DL_SEL)
|
||||
#define FW_READY_MASK 0xffff
|
||||
#define FW_READY_MASK (0xffff & ~BIT_CPU_CLK_SEL)
|
||||
|
||||
#define REG_MCU_TST_CFG 0x84
|
||||
#define VAL_FW_TRIGGER 0x1
|
||||
|
||||
@@ -89,10 +89,10 @@ static const struct rtw89_btc_fbtc_slot s_def[] = {
|
||||
[CXST_B4] = __DEF_FBTC_SLOT(50, 0xe5555555, SLOT_MIX),
|
||||
[CXST_LK] = __DEF_FBTC_SLOT(20, 0xea5a5a5a, SLOT_ISO),
|
||||
[CXST_BLK] = __DEF_FBTC_SLOT(500, 0x55555555, SLOT_MIX),
|
||||
[CXST_E2G] = __DEF_FBTC_SLOT(0, 0xea5a5a5a, SLOT_MIX),
|
||||
[CXST_E5G] = __DEF_FBTC_SLOT(0, 0xffffffff, SLOT_ISO),
|
||||
[CXST_E2G] = __DEF_FBTC_SLOT(5, 0xea5a5a5a, SLOT_MIX),
|
||||
[CXST_E5G] = __DEF_FBTC_SLOT(5, 0xffffffff, SLOT_ISO),
|
||||
[CXST_EBT] = __DEF_FBTC_SLOT(5, 0xe5555555, SLOT_MIX),
|
||||
[CXST_ENULL] = __DEF_FBTC_SLOT(0, 0xaaaaaaaa, SLOT_ISO),
|
||||
[CXST_ENULL] = __DEF_FBTC_SLOT(5, 0xaaaaaaaa, SLOT_ISO),
|
||||
[CXST_WLK] = __DEF_FBTC_SLOT(250, 0xea5a5a5a, SLOT_MIX),
|
||||
[CXST_W1FDD] = __DEF_FBTC_SLOT(50, 0xffffffff, SLOT_ISO),
|
||||
[CXST_B1FDD] = __DEF_FBTC_SLOT(50, 0xffffdfff, SLOT_ISO),
|
||||
|
||||
@@ -4862,8 +4862,6 @@ static int rtw89_chip_efuse_info_setup(struct rtw89_dev *rtwdev)
|
||||
|
||||
rtw89_hci_mac_pre_deinit(rtwdev);
|
||||
|
||||
rtw89_mac_pwr_off(rtwdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -4944,36 +4942,45 @@ int rtw89_chip_info_setup(struct rtw89_dev *rtwdev)
|
||||
|
||||
rtw89_read_chip_ver(rtwdev);
|
||||
|
||||
ret = rtw89_mac_pwr_on(rtwdev);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to power on\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_wait_firmware_completion(rtwdev);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to wait firmware completion\n");
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_recognize(rtwdev);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to recognize firmware\n");
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = rtw89_chip_efuse_info_setup(rtwdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
ret = rtw89_fw_recognize_elements(rtwdev);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to recognize firmware elements\n");
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = rtw89_chip_board_info_setup(rtwdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
rtw89_core_setup_rfe_parms(rtwdev);
|
||||
rtwdev->ps_mode = rtw89_update_ps_mode(rtwdev);
|
||||
|
||||
return 0;
|
||||
out:
|
||||
rtw89_mac_pwr_off(rtwdev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_chip_info_setup);
|
||||
|
||||
|
||||
@@ -501,6 +501,30 @@ static int rtw89_fw_hdr_parser(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
}
|
||||
|
||||
static int rtw89_mfw_validate_hdr(struct rtw89_dev *rtwdev,
|
||||
const struct firmware *firmware,
|
||||
const struct rtw89_mfw_hdr *mfw_hdr)
|
||||
{
|
||||
const void *mfw = firmware->data;
|
||||
u32 mfw_len = firmware->size;
|
||||
u8 fw_nr = mfw_hdr->fw_nr;
|
||||
const void *ptr;
|
||||
|
||||
if (fw_nr == 0) {
|
||||
rtw89_err(rtwdev, "mfw header has no fw entry\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
ptr = &mfw_hdr->info[fw_nr];
|
||||
|
||||
if (ptr > mfw + mfw_len) {
|
||||
rtw89_err(rtwdev, "mfw header out of address\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
|
||||
struct rtw89_fw_suit *fw_suit, bool nowarn)
|
||||
@@ -511,6 +535,7 @@ int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
|
||||
u32 mfw_len = firmware->size;
|
||||
const struct rtw89_mfw_hdr *mfw_hdr = (const struct rtw89_mfw_hdr *)mfw;
|
||||
const struct rtw89_mfw_info *mfw_info = NULL, *tmp;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
if (mfw_hdr->sig != RTW89_MFW_SIG) {
|
||||
@@ -523,6 +548,10 @@ int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = rtw89_mfw_validate_hdr(rtwdev, firmware, mfw_hdr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < mfw_hdr->fw_nr; i++) {
|
||||
tmp = &mfw_hdr->info[i];
|
||||
if (tmp->type != type)
|
||||
@@ -552,6 +581,12 @@ int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
|
||||
found:
|
||||
fw_suit->data = mfw + le32_to_cpu(mfw_info->shift);
|
||||
fw_suit->size = le32_to_cpu(mfw_info->size);
|
||||
|
||||
if (fw_suit->data + fw_suit->size > mfw + mfw_len) {
|
||||
rtw89_err(rtwdev, "fw_suit %d out of address\n", type);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -563,12 +598,17 @@ static u32 rtw89_mfw_get_size(struct rtw89_dev *rtwdev)
|
||||
(const struct rtw89_mfw_hdr *)firmware->data;
|
||||
const struct rtw89_mfw_info *mfw_info;
|
||||
u32 size;
|
||||
int ret;
|
||||
|
||||
if (mfw_hdr->sig != RTW89_MFW_SIG) {
|
||||
rtw89_warn(rtwdev, "not mfw format\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = rtw89_mfw_validate_hdr(rtwdev, firmware, mfw_hdr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mfw_info = &mfw_hdr->info[mfw_hdr->fw_nr - 1];
|
||||
size = le32_to_cpu(mfw_info->shift) + le32_to_cpu(mfw_info->size);
|
||||
|
||||
|
||||
@@ -1491,6 +1491,21 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
|
||||
#undef PWR_ACT
|
||||
}
|
||||
|
||||
int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = rtw89_mac_power_switch(rtwdev, true);
|
||||
if (ret) {
|
||||
rtw89_mac_power_switch(rtwdev, false);
|
||||
ret = rtw89_mac_power_switch(rtwdev, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rtw89_mac_pwr_off(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
rtw89_mac_power_switch(rtwdev, false);
|
||||
@@ -3918,14 +3933,6 @@ int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = rtw89_mac_power_switch(rtwdev, true);
|
||||
if (ret) {
|
||||
rtw89_mac_power_switch(rtwdev, false);
|
||||
ret = rtw89_mac_power_switch(rtwdev, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
rtw89_mac_ctrl_hci_dma_trx(rtwdev, true);
|
||||
|
||||
if (include_bb) {
|
||||
@@ -3958,6 +3965,10 @@ int rtw89_mac_init(struct rtw89_dev *rtwdev)
|
||||
bool include_bb = !!chip->bbmcu_nr;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_mac_pwr_on(rtwdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = rtw89_mac_partial_init(rtwdev, include_bb);
|
||||
if (ret)
|
||||
goto fail;
|
||||
@@ -3989,7 +4000,7 @@ int rtw89_mac_init(struct rtw89_dev *rtwdev)
|
||||
|
||||
return ret;
|
||||
fail:
|
||||
rtw89_mac_power_switch(rtwdev, false);
|
||||
rtw89_mac_pwr_off(rtwdev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1120,6 +1120,7 @@ rtw89_write32_port_set(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_l
|
||||
rtw89_write32_set(rtwdev, reg, bit);
|
||||
}
|
||||
|
||||
int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev);
|
||||
void rtw89_mac_pwr_off(struct rtw89_dev *rtwdev);
|
||||
int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb);
|
||||
int rtw89_mac_init(struct rtw89_dev *rtwdev);
|
||||
|
||||
@@ -2151,8 +2151,10 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode)
|
||||
if (descr->serv_action_valid)
|
||||
return TCM_INVALID_CDB_FIELD;
|
||||
|
||||
if (!descr->enabled || descr->enabled(descr, cmd))
|
||||
if (!descr->enabled || descr->enabled(descr, cmd)) {
|
||||
*opcode = descr;
|
||||
return TCM_NO_SENSE;
|
||||
}
|
||||
break;
|
||||
case 0x2:
|
||||
/*
|
||||
@@ -2166,8 +2168,10 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode)
|
||||
if (descr->serv_action_valid &&
|
||||
descr->service_action == requested_sa) {
|
||||
if (!descr->enabled || descr->enabled(descr,
|
||||
cmd))
|
||||
cmd)) {
|
||||
*opcode = descr;
|
||||
return TCM_NO_SENSE;
|
||||
}
|
||||
} else if (!descr->serv_action_valid)
|
||||
return TCM_INVALID_CDB_FIELD;
|
||||
break;
|
||||
@@ -2180,13 +2184,15 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode)
|
||||
*/
|
||||
if (descr->service_action == requested_sa)
|
||||
if (!descr->enabled || descr->enabled(descr,
|
||||
cmd))
|
||||
cmd)) {
|
||||
*opcode = descr;
|
||||
return TCM_NO_SENSE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
return TCM_NO_SENSE;
|
||||
}
|
||||
|
||||
static sense_reason_t
|
||||
|
||||
@@ -3013,6 +3013,8 @@ extern int ext4_inode_attach_jinode(struct inode *inode);
|
||||
extern int ext4_can_truncate(struct inode *inode);
|
||||
extern int ext4_truncate(struct inode *);
|
||||
extern int ext4_break_layouts(struct inode *);
|
||||
extern int ext4_truncate_page_cache_block_range(struct inode *inode,
|
||||
loff_t start, loff_t end);
|
||||
extern int ext4_punch_hole(struct file *file, loff_t offset, loff_t length);
|
||||
extern void ext4_set_inode_flags(struct inode *, bool init);
|
||||
extern int ext4_alloc_da_blocks(struct inode *inode);
|
||||
|
||||
@@ -4667,22 +4667,13 @@ static long ext4_zero_range(struct file *file, loff_t offset,
|
||||
goto out_mutex;
|
||||
}
|
||||
|
||||
/*
|
||||
* For journalled data we need to write (and checkpoint) pages
|
||||
* before discarding page cache to avoid inconsitent data on
|
||||
* disk in case of crash before zeroing trans is committed.
|
||||
*/
|
||||
if (ext4_should_journal_data(inode)) {
|
||||
ret = filemap_write_and_wait_range(mapping, start,
|
||||
end - 1);
|
||||
if (ret) {
|
||||
filemap_invalidate_unlock(mapping);
|
||||
goto out_mutex;
|
||||
}
|
||||
/* Now release the pages and zero block aligned part of pages */
|
||||
ret = ext4_truncate_page_cache_block_range(inode, start, end);
|
||||
if (ret) {
|
||||
filemap_invalidate_unlock(mapping);
|
||||
goto out_mutex;
|
||||
}
|
||||
|
||||
/* Now release the pages and zero block aligned part of pages */
|
||||
truncate_pagecache_range(inode, start, end - 1);
|
||||
inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
|
||||
|
||||
ret = ext4_alloc_file_blocks(file, lblk, max_blocks, new_size,
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <linux/writeback.h>
|
||||
#include <linux/pagevec.h>
|
||||
#include <linux/mpage.h>
|
||||
#include <linux/rmap.h>
|
||||
#include <linux/namei.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/bio.h>
|
||||
@@ -3879,6 +3880,68 @@ int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void ext4_truncate_folio(struct inode *inode,
|
||||
loff_t start, loff_t end)
|
||||
{
|
||||
unsigned long blocksize = i_blocksize(inode);
|
||||
struct folio *folio;
|
||||
|
||||
/* Nothing to be done if no complete block needs to be truncated. */
|
||||
if (round_up(start, blocksize) >= round_down(end, blocksize))
|
||||
return;
|
||||
|
||||
folio = filemap_lock_folio(inode->i_mapping, start >> PAGE_SHIFT);
|
||||
if (IS_ERR(folio))
|
||||
return;
|
||||
|
||||
if (folio_mkclean(folio))
|
||||
folio_mark_dirty(folio);
|
||||
folio_unlock(folio);
|
||||
folio_put(folio);
|
||||
}
|
||||
|
||||
int ext4_truncate_page_cache_block_range(struct inode *inode,
|
||||
loff_t start, loff_t end)
|
||||
{
|
||||
unsigned long blocksize = i_blocksize(inode);
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* For journalled data we need to write (and checkpoint) pages
|
||||
* before discarding page cache to avoid inconsitent data on disk
|
||||
* in case of crash before freeing or unwritten converting trans
|
||||
* is committed.
|
||||
*/
|
||||
if (ext4_should_journal_data(inode)) {
|
||||
ret = filemap_write_and_wait_range(inode->i_mapping, start,
|
||||
end - 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto truncate_pagecache;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the block size is less than the page size, the file's mapped
|
||||
* blocks within one page could be freed or converted to unwritten.
|
||||
* So it's necessary to remove writable userspace mappings, and then
|
||||
* ext4_page_mkwrite() can be called during subsequent write access
|
||||
* to these partial folios.
|
||||
*/
|
||||
if (!IS_ALIGNED(start | end, PAGE_SIZE) &&
|
||||
blocksize < PAGE_SIZE && start < inode->i_size) {
|
||||
loff_t page_boundary = round_up(start, PAGE_SIZE);
|
||||
|
||||
ext4_truncate_folio(inode, start, min(page_boundary, end));
|
||||
if (end > page_boundary)
|
||||
ext4_truncate_folio(inode,
|
||||
round_down(end, PAGE_SIZE), end);
|
||||
}
|
||||
|
||||
truncate_pagecache:
|
||||
truncate_pagecache_range(inode, start, end - 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ext4_wait_dax_page(struct inode *inode)
|
||||
{
|
||||
filemap_invalidate_unlock(inode->i_mapping);
|
||||
@@ -3933,17 +3996,6 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length)
|
||||
|
||||
trace_ext4_punch_hole(inode, offset, length, 0);
|
||||
|
||||
/*
|
||||
* Write out all dirty pages to avoid race conditions
|
||||
* Then release them.
|
||||
*/
|
||||
if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) {
|
||||
ret = filemap_write_and_wait_range(mapping, offset,
|
||||
offset + length - 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
inode_lock(inode);
|
||||
|
||||
/* No need to punch hole beyond i_size */
|
||||
@@ -4005,8 +4057,11 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length)
|
||||
ret = ext4_update_disksize_before_punch(inode, offset, length);
|
||||
if (ret)
|
||||
goto out_dio;
|
||||
truncate_pagecache_range(inode, first_block_offset,
|
||||
last_block_offset);
|
||||
|
||||
ret = ext4_truncate_page_cache_block_range(inode,
|
||||
first_block_offset, last_block_offset + 1);
|
||||
if (ret)
|
||||
goto out_dio;
|
||||
}
|
||||
|
||||
if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
|
||||
|
||||
@@ -265,7 +265,7 @@ static void parse_options(char *options)
|
||||
static int pstore_show_options(struct seq_file *m, struct dentry *root)
|
||||
{
|
||||
if (kmsg_bytes != CONFIG_PSTORE_DEFAULT_KMSG_BYTES)
|
||||
seq_printf(m, ",kmsg_bytes=%lu", kmsg_bytes);
|
||||
seq_printf(m, ",kmsg_bytes=%u", kmsg_bytes);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <linux/time.h>
|
||||
#include <linux/pstore.h>
|
||||
|
||||
extern unsigned long kmsg_bytes;
|
||||
extern unsigned int kmsg_bytes;
|
||||
|
||||
#ifdef CONFIG_PSTORE_FTRACE
|
||||
extern void pstore_register_ftrace(void);
|
||||
@@ -35,7 +35,7 @@ static inline void pstore_unregister_pmsg(void) {}
|
||||
|
||||
extern struct pstore_info *psinfo;
|
||||
|
||||
extern void pstore_set_kmsg_bytes(int);
|
||||
extern void pstore_set_kmsg_bytes(unsigned int bytes);
|
||||
extern void pstore_get_records(int);
|
||||
extern void pstore_get_backend_records(struct pstore_info *psi,
|
||||
struct dentry *root, int quiet);
|
||||
|
||||
@@ -92,8 +92,8 @@ module_param(compress, charp, 0444);
|
||||
MODULE_PARM_DESC(compress, "compression to use");
|
||||
|
||||
/* How much of the kernel log to snapshot */
|
||||
unsigned long kmsg_bytes = CONFIG_PSTORE_DEFAULT_KMSG_BYTES;
|
||||
module_param(kmsg_bytes, ulong, 0444);
|
||||
unsigned int kmsg_bytes = CONFIG_PSTORE_DEFAULT_KMSG_BYTES;
|
||||
module_param(kmsg_bytes, uint, 0444);
|
||||
MODULE_PARM_DESC(kmsg_bytes, "amount of kernel log to snapshot (in bytes)");
|
||||
|
||||
static void *compress_workspace;
|
||||
@@ -107,9 +107,9 @@ static void *compress_workspace;
|
||||
static char *big_oops_buf;
|
||||
static size_t max_compressed_size;
|
||||
|
||||
void pstore_set_kmsg_bytes(int bytes)
|
||||
void pstore_set_kmsg_bytes(unsigned int bytes)
|
||||
{
|
||||
kmsg_bytes = bytes;
|
||||
WRITE_ONCE(kmsg_bytes, bytes);
|
||||
}
|
||||
|
||||
/* Tag each group of saved records with a sequence number */
|
||||
@@ -278,6 +278,7 @@ static void pstore_dump(struct kmsg_dumper *dumper,
|
||||
struct kmsg_dump_detail *detail)
|
||||
{
|
||||
struct kmsg_dump_iter iter;
|
||||
unsigned int remaining = READ_ONCE(kmsg_bytes);
|
||||
unsigned long total = 0;
|
||||
const char *why;
|
||||
unsigned int part = 1;
|
||||
@@ -300,7 +301,7 @@ static void pstore_dump(struct kmsg_dumper *dumper,
|
||||
kmsg_dump_rewind(&iter);
|
||||
|
||||
oopscount++;
|
||||
while (total < kmsg_bytes) {
|
||||
while (total < remaining) {
|
||||
char *dst;
|
||||
size_t dst_size;
|
||||
int header_size;
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#define VENDOR_ID_NVIDIA 0x0955
|
||||
#define VENDOR_ID_TPLINK 0x2357
|
||||
#define VENDOR_ID_DLINK 0x2001
|
||||
#define VENDOR_ID_DELL 0x413c
|
||||
#define VENDOR_ID_ASUS 0x0b05
|
||||
|
||||
#if IS_REACHABLE(CONFIG_USB_RTL8152)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2015 - 2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018 - 2024 Intel Corporation
|
||||
* Copyright (C) 2018 - 2025 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef MAC80211_H
|
||||
@@ -3817,7 +3817,7 @@ enum ieee80211_reconfig_type {
|
||||
* @was_assoc: set if this call is due to deauth/disassoc
|
||||
* while just having been associated
|
||||
* @link_id: the link id on which the frame will be TX'ed.
|
||||
* Only used with the mgd_prepare_tx() method.
|
||||
* 0 for a non-MLO connection.
|
||||
*/
|
||||
struct ieee80211_prep_tx_info {
|
||||
u16 duration;
|
||||
|
||||
@@ -148,6 +148,18 @@ void xdp_do_check_flushed(struct napi_struct *napi);
|
||||
static inline void xdp_do_check_flushed(struct napi_struct *napi) { }
|
||||
#endif
|
||||
|
||||
/* Best effort check that NAPI is not idle (can't be scheduled to run) */
|
||||
static inline void napi_assert_will_not_race(const struct napi_struct *napi)
|
||||
{
|
||||
/* uninitialized instance, can't race */
|
||||
if (!napi->poll_list.next)
|
||||
return;
|
||||
|
||||
/* SCHED bit is set on disabled instances */
|
||||
WARN_ON(!test_bit(NAPI_STATE_SCHED, &napi->state));
|
||||
WARN_ON(READ_ONCE(napi->list_owner) != -1);
|
||||
}
|
||||
|
||||
void kick_defer_list_purge(struct softnet_data *sd, unsigned int cpu);
|
||||
|
||||
#define XMIT_RECURSION_LIMIT 8
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include <trace/events/page_pool.h>
|
||||
|
||||
#include "dev.h"
|
||||
#include "mp_dmabuf_devmem.h"
|
||||
#include "netmem_priv.h"
|
||||
#include "page_pool_priv.h"
|
||||
@@ -1108,11 +1109,7 @@ void page_pool_disable_direct_recycling(struct page_pool *pool)
|
||||
if (!pool->p.napi)
|
||||
return;
|
||||
|
||||
/* To avoid races with recycling and additional barriers make sure
|
||||
* pool and NAPI are unlinked when NAPI is disabled.
|
||||
*/
|
||||
WARN_ON(!test_bit(NAPI_STATE_SCHED, &pool->p.napi->state));
|
||||
WARN_ON(READ_ONCE(pool->p.napi->list_owner) != -1);
|
||||
napi_assert_will_not_race(pool->p.napi);
|
||||
|
||||
WRITE_ONCE(pool->p.napi, NULL);
|
||||
}
|
||||
|
||||
@@ -245,9 +245,9 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
|
||||
struct nlattr **tb,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct net *net = sock_net(skb->sk);
|
||||
struct fib4_rule *rule4 = (struct fib4_rule *)rule;
|
||||
struct net *net = rule->fr_net;
|
||||
int err = -EINVAL;
|
||||
struct fib4_rule *rule4 = (struct fib4_rule *) rule;
|
||||
|
||||
if (!inet_validate_dscp(frh->tos)) {
|
||||
NL_SET_ERR_MSG(extack,
|
||||
|
||||
@@ -365,9 +365,9 @@ static int fib6_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
|
||||
struct nlattr **tb,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct fib6_rule *rule6 = (struct fib6_rule *)rule;
|
||||
struct net *net = rule->fr_net;
|
||||
int err = -EINVAL;
|
||||
struct net *net = sock_net(skb->sk);
|
||||
struct fib6_rule *rule6 = (struct fib6_rule *) rule;
|
||||
|
||||
if (!inet_validate_dscp(frh->tos)) {
|
||||
NL_SET_ERR_MSG(extack,
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/*
|
||||
* Portions of this file
|
||||
* Copyright(c) 2016 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018-2019, 2021-2024 Intel Corporation
|
||||
* Copyright (C) 2018-2019, 2021-2025 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef __MAC80211_DRIVER_OPS
|
||||
@@ -955,6 +955,7 @@ static inline void drv_mgd_complete_tx(struct ieee80211_local *local,
|
||||
return;
|
||||
WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION);
|
||||
|
||||
info->link_id = info->link_id < 0 ? 0 : info->link_id;
|
||||
trace_drv_mgd_complete_tx(local, sdata, info->duration,
|
||||
info->subtype, info->success);
|
||||
if (local->ops->mgd_complete_tx)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* Copyright 2007, Michael Wu <flamingice@sourmilk.net>
|
||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2015 - 2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018 - 2024 Intel Corporation
|
||||
* Copyright (C) 2018 - 2025 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
@@ -3589,7 +3589,8 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||
if (tx)
|
||||
ieee80211_flush_queues(local, sdata, false);
|
||||
|
||||
drv_mgd_complete_tx(sdata->local, sdata, &info);
|
||||
if (tx || frame_buf)
|
||||
drv_mgd_complete_tx(sdata->local, sdata, &info);
|
||||
|
||||
/* clear AP addr only after building the needed mgmt frames */
|
||||
eth_zero_addr(sdata->deflink.u.mgd.bssid);
|
||||
@@ -4306,6 +4307,8 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
|
||||
auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
|
||||
status_code = le16_to_cpu(mgmt->u.auth.status_code);
|
||||
|
||||
info.link_id = ifmgd->auth_data->link_id;
|
||||
|
||||
if (auth_alg != ifmgd->auth_data->algorithm ||
|
||||
(auth_alg != WLAN_AUTH_SAE &&
|
||||
auth_transaction != ifmgd->auth_data->expected_transaction) ||
|
||||
@@ -9219,7 +9222,6 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_report_disconnect(sdata, frame_buf,
|
||||
sizeof(frame_buf), true,
|
||||
req->reason_code, false);
|
||||
drv_mgd_complete_tx(sdata->local, sdata, &info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -589,11 +589,9 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info)
|
||||
if (ret < 0)
|
||||
goto set_flags_err;
|
||||
|
||||
if (attr_rem) {
|
||||
ret = mptcp_pm_parse_entry(attr_rem, info, false, &rem);
|
||||
if (ret < 0)
|
||||
goto set_flags_err;
|
||||
}
|
||||
ret = mptcp_pm_parse_entry(attr_rem, info, false, &rem);
|
||||
if (ret < 0)
|
||||
goto set_flags_err;
|
||||
|
||||
if (loc.addr.family == AF_UNSPEC ||
|
||||
rem.addr.family == AF_UNSPEC) {
|
||||
|
||||
@@ -178,6 +178,12 @@ static inline int verify_replay(struct xfrm_usersa_info *p,
|
||||
"Replay seq and seq_hi should be 0 for output SA");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (rs->oseq_hi && !(p->flags & XFRM_STATE_ESN)) {
|
||||
NL_SET_ERR_MSG(
|
||||
extack,
|
||||
"Replay oseq_hi should be 0 in non-ESN mode for output SA");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (rs->bmp_len) {
|
||||
NL_SET_ERR_MSG(extack, "Replay bmp_len should 0 for output SA");
|
||||
return -EINVAL;
|
||||
@@ -190,6 +196,12 @@ static inline int verify_replay(struct xfrm_usersa_info *p,
|
||||
"Replay oseq and oseq_hi should be 0 for input SA");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (rs->seq_hi && !(p->flags & XFRM_STATE_ESN)) {
|
||||
NL_SET_ERR_MSG(
|
||||
extack,
|
||||
"Replay seq_hi should be 0 in non-ESN mode for input SA");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -199,6 +199,7 @@ The system configuration dump (if --quiet is not used) is followed by statistics
|
||||
\fBUncMHz\fP per-package uncore MHz, instantaneous sample.
|
||||
.PP
|
||||
\fBUMHz1.0\fP per-package uncore MHz for domain=1 and fabric_cluster=0, instantaneous sample. System summary is the average of all packages.
|
||||
For the "--show" and "--hide" options, use "UncMHz" to operate on all UMHz*.* as a group.
|
||||
.SH TOO MUCH INFORMATION EXAMPLE
|
||||
By default, turbostat dumps all possible information -- a system configuration header, followed by columns for all counters.
|
||||
This is ideal for remote debugging, use the "--out" option to save everything to a text file, and get that file to the expert helping you debug.
|
||||
|
||||
@@ -6445,7 +6445,18 @@ static void probe_intel_uncore_frequency_cluster(void)
|
||||
sprintf(path, "%s/current_freq_khz", path_base);
|
||||
sprintf(name_buf, "UMHz%d.%d", domain_id, cluster_id);
|
||||
|
||||
add_counter(0, path, name_buf, 0, SCOPE_PACKAGE, COUNTER_K2M, FORMAT_AVERAGE, 0, package_id);
|
||||
/*
|
||||
* Once add_couter() is called, that counter is always read
|
||||
* and reported -- So it is effectively (enabled & present).
|
||||
* Only call add_counter() here if legacy BIC_UNCORE_MHZ (UncMHz)
|
||||
* is (enabled). Since we are in this routine, we
|
||||
* know we will not probe and set (present) the legacy counter.
|
||||
*
|
||||
* This allows "--show/--hide UncMHz" to be effective for
|
||||
* the clustered MHz counters, as a group.
|
||||
*/
|
||||
if BIC_IS_ENABLED(BIC_UNCORE_MHZ)
|
||||
add_counter(0, path, name_buf, 0, SCOPE_PACKAGE, COUNTER_K2M, FORMAT_AVERAGE, 0, package_id);
|
||||
|
||||
if (quiet)
|
||||
continue;
|
||||
|
||||
Reference in New Issue
Block a user