Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0bfd8ffeff | |||
| 7c3f227d5f | |||
| eb1b60a0fb | |||
| 32c0e1fe6f | |||
| 7e98a1733e | |||
| b85fffd687 | |||
| 71f5fafba8 | |||
| e71ac54f81 | |||
| 086ae86eff | |||
| 36d51588f8 | |||
| 79f4ae0c56 | |||
| f22351258e | |||
| 1435b05b04 | |||
| a7656384c9 | |||
| 429d8945a2 | |||
| da9d83cf6e | |||
| 6fddcaed97 | |||
| d66affca23 | |||
| eb3c8adad2 | |||
| 514b17caf1 | |||
| c2672f87c3 | |||
| 71b86dfc5e |
2
Makefile
2
Makefile
@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 3
|
||||
SUBLEVEL = 4
|
||||
EXTRAVERSION =
|
||||
NAME = Unicycling Gorilla
|
||||
|
||||
|
||||
@ -136,8 +136,6 @@ void disable_debug_monitors(enum debug_el el)
|
||||
*/
|
||||
static void clear_os_lock(void *unused)
|
||||
{
|
||||
asm volatile("msr mdscr_el1, %0" : : "r" (0));
|
||||
isb();
|
||||
asm volatile("msr oslar_el1, %0" : : "r" (0));
|
||||
isb();
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ loop1:
|
||||
add x2, x2, #4 // add 4 (line length offset)
|
||||
mov x4, #0x3ff
|
||||
and x4, x4, x1, lsr #3 // find maximum number on the way size
|
||||
clz x5, x4 // find bit position of way size increment
|
||||
clz w5, w4 // find bit position of way size increment
|
||||
mov x7, #0x7fff
|
||||
and x7, x7, x1, lsr #13 // extract max number of the index size
|
||||
loop2:
|
||||
|
||||
@ -119,8 +119,7 @@ ENTRY(__cpu_setup)
|
||||
|
||||
mov x0, #3 << 20
|
||||
msr cpacr_el1, x0 // Enable FP/ASIMD
|
||||
mov x0, #1
|
||||
msr oslar_el1, x0 // Set the debug OS lock
|
||||
msr mdscr_el1, xzr // Reset mdscr_el1
|
||||
tlbi vmalle1is // invalidate I + D TLBs
|
||||
/*
|
||||
* Memory region attributes for LPAE:
|
||||
|
||||
@ -37,8 +37,8 @@ asmlinkage int sys_get_thread_area(struct user_desc __user *);
|
||||
unsigned long sys_sigreturn(void);
|
||||
|
||||
/* kernel/vm86_32.c */
|
||||
int sys_vm86old(struct vm86_struct __user *);
|
||||
int sys_vm86(unsigned long, unsigned long);
|
||||
asmlinkage long sys_vm86old(struct vm86_struct __user *);
|
||||
asmlinkage long sys_vm86(unsigned long, unsigned long);
|
||||
|
||||
#else /* CONFIG_X86_32 */
|
||||
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
extern pgd_t early_level4_pgt[PTRS_PER_PGD];
|
||||
extern pmd_t early_dynamic_pgts[EARLY_DYNAMIC_PAGE_TABLES][PTRS_PER_PMD];
|
||||
static unsigned int __initdata next_early_pgt = 2;
|
||||
pmdval_t __initdata early_pmd_flags = __PAGE_KERNEL_LARGE & ~(_PAGE_GLOBAL | _PAGE_NX);
|
||||
pmdval_t early_pmd_flags = __PAGE_KERNEL_LARGE & ~(_PAGE_GLOBAL | _PAGE_NX);
|
||||
|
||||
/* Wipe all early page tables except for the kernel symbol map */
|
||||
static void __init reset_early_page_tables(void)
|
||||
|
||||
@ -33,6 +33,7 @@
|
||||
#include <linux/capability.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/signal.h>
|
||||
@ -48,7 +49,6 @@
|
||||
#include <asm/io.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/syscalls.h>
|
||||
|
||||
/*
|
||||
* Known problems:
|
||||
@ -202,17 +202,16 @@ out:
|
||||
static int do_vm86_irq_handling(int subfunction, int irqnumber);
|
||||
static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk);
|
||||
|
||||
int sys_vm86old(struct vm86_struct __user *v86)
|
||||
SYSCALL_DEFINE1(vm86old, struct vm86_struct __user *, v86)
|
||||
{
|
||||
struct kernel_vm86_struct info; /* declare this _on top_,
|
||||
* this avoids wasting of stack space.
|
||||
* This remains on the stack until we
|
||||
* return to 32 bit user space.
|
||||
*/
|
||||
struct task_struct *tsk;
|
||||
struct task_struct *tsk = current;
|
||||
int tmp, ret = -EPERM;
|
||||
|
||||
tsk = current;
|
||||
if (tsk->thread.saved_sp0)
|
||||
goto out;
|
||||
tmp = copy_vm86_regs_from_user(&info.regs, &v86->regs,
|
||||
@ -227,11 +226,12 @@ int sys_vm86old(struct vm86_struct __user *v86)
|
||||
do_sys_vm86(&info, tsk);
|
||||
ret = 0; /* we never return here */
|
||||
out:
|
||||
asmlinkage_protect(1, ret, v86);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int sys_vm86(unsigned long cmd, unsigned long arg)
|
||||
SYSCALL_DEFINE2(vm86, unsigned long, cmd, unsigned long, arg)
|
||||
{
|
||||
struct kernel_vm86_struct info; /* declare this _on top_,
|
||||
* this avoids wasting of stack space.
|
||||
@ -278,6 +278,7 @@ int sys_vm86(unsigned long cmd, unsigned long arg)
|
||||
do_sys_vm86(&info, tsk);
|
||||
ret = 0; /* we never return here */
|
||||
out:
|
||||
asmlinkage_protect(2, ret, cmd, arg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@ -1926,8 +1926,8 @@ init_zm_mask_add(struct nvbios_init *init)
|
||||
trace("ZM_MASK_ADD\tR[0x%06x] &= 0x%08x += 0x%08x\n", addr, mask, add);
|
||||
init->offset += 13;
|
||||
|
||||
data = init_rd32(init, addr) & mask;
|
||||
data |= ((data + add) & ~mask);
|
||||
data = init_rd32(init, addr);
|
||||
data = (data & mask) | ((data + add) & ~mask);
|
||||
init_wr32(init, addr, data);
|
||||
}
|
||||
|
||||
|
||||
@ -2400,8 +2400,8 @@ int evergreen_mc_init(struct radeon_device *rdev)
|
||||
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
|
||||
} else {
|
||||
/* size in MB on evergreen/cayman/tn */
|
||||
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
|
||||
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
|
||||
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
|
||||
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
|
||||
}
|
||||
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
||||
r700_vram_gtt_location(rdev, &rdev->mc);
|
||||
|
||||
@ -726,7 +726,7 @@ int radeon_ttm_init(struct radeon_device *rdev)
|
||||
return r;
|
||||
}
|
||||
DRM_INFO("radeon: %uM of VRAM memory ready\n",
|
||||
(unsigned)rdev->mc.real_vram_size / (1024 * 1024));
|
||||
(unsigned) (rdev->mc.real_vram_size / (1024 * 1024)));
|
||||
r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_TT,
|
||||
rdev->mc.gtt_size >> PAGE_SHIFT);
|
||||
if (r) {
|
||||
|
||||
@ -2644,8 +2644,8 @@ static int si_mc_init(struct radeon_device *rdev)
|
||||
rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
|
||||
rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
|
||||
/* size in MB on si */
|
||||
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
|
||||
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
|
||||
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
|
||||
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
|
||||
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
||||
si_vram_gtt_location(rdev, &rdev->mc);
|
||||
radeon_update_bandwidth_info(rdev);
|
||||
|
||||
@ -1411,14 +1411,18 @@ static int abituguru_probe(struct platform_device *pdev)
|
||||
pr_info("found Abit uGuru\n");
|
||||
|
||||
/* Register sysfs hooks */
|
||||
for (i = 0; i < sysfs_attr_i; i++)
|
||||
if (device_create_file(&pdev->dev,
|
||||
&data->sysfs_attr[i].dev_attr))
|
||||
for (i = 0; i < sysfs_attr_i; i++) {
|
||||
res = device_create_file(&pdev->dev,
|
||||
&data->sysfs_attr[i].dev_attr);
|
||||
if (res)
|
||||
goto abituguru_probe_error;
|
||||
for (i = 0; i < ARRAY_SIZE(abituguru_sysfs_attr); i++)
|
||||
if (device_create_file(&pdev->dev,
|
||||
&abituguru_sysfs_attr[i].dev_attr))
|
||||
}
|
||||
for (i = 0; i < ARRAY_SIZE(abituguru_sysfs_attr); i++) {
|
||||
res = device_create_file(&pdev->dev,
|
||||
&abituguru_sysfs_attr[i].dev_attr);
|
||||
if (res)
|
||||
goto abituguru_probe_error;
|
||||
}
|
||||
|
||||
data->hwmon_dev = hwmon_device_register(&pdev->dev);
|
||||
if (!IS_ERR(data->hwmon_dev))
|
||||
|
||||
@ -361,7 +361,8 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)
|
||||
/* Enable the adapter */
|
||||
dw_writel(dev, 1, DW_IC_ENABLE);
|
||||
|
||||
/* Enable interrupts */
|
||||
/* Clear and enable interrupts */
|
||||
i2c_dw_clear_int(dev);
|
||||
dw_writel(dev, DW_IC_INTR_DEFAULT_MASK, DW_IC_INTR_MASK);
|
||||
}
|
||||
|
||||
@ -426,8 +427,14 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev)
|
||||
cmd |= BIT(9);
|
||||
|
||||
if (msgs[dev->msg_write_idx].flags & I2C_M_RD) {
|
||||
|
||||
/* avoid rx buffer overrun */
|
||||
if (rx_limit - dev->rx_outstanding <= 0)
|
||||
break;
|
||||
|
||||
dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD);
|
||||
rx_limit--;
|
||||
dev->rx_outstanding++;
|
||||
} else
|
||||
dw_writel(dev, cmd | *buf++, DW_IC_DATA_CMD);
|
||||
tx_limit--; buf_len--;
|
||||
@ -480,8 +487,10 @@ i2c_dw_read(struct dw_i2c_dev *dev)
|
||||
|
||||
rx_valid = dw_readl(dev, DW_IC_RXFLR);
|
||||
|
||||
for (; len > 0 && rx_valid > 0; len--, rx_valid--)
|
||||
for (; len > 0 && rx_valid > 0; len--, rx_valid--) {
|
||||
*buf++ = dw_readl(dev, DW_IC_DATA_CMD);
|
||||
dev->rx_outstanding--;
|
||||
}
|
||||
|
||||
if (len > 0) {
|
||||
dev->status |= STATUS_READ_IN_PROGRESS;
|
||||
@ -539,6 +548,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
|
||||
dev->msg_err = 0;
|
||||
dev->status = STATUS_IDLE;
|
||||
dev->abort_source = 0;
|
||||
dev->rx_outstanding = 0;
|
||||
|
||||
ret = i2c_dw_wait_bus_not_busy(dev);
|
||||
if (ret < 0)
|
||||
|
||||
@ -60,6 +60,7 @@
|
||||
* @adapter: i2c subsystem adapter node
|
||||
* @tx_fifo_depth: depth of the hardware tx fifo
|
||||
* @rx_fifo_depth: depth of the hardware rx fifo
|
||||
* @rx_outstanding: current master-rx elements in tx fifo
|
||||
*/
|
||||
struct dw_i2c_dev {
|
||||
struct device *dev;
|
||||
@ -88,6 +89,7 @@ struct dw_i2c_dev {
|
||||
u32 master_cfg;
|
||||
unsigned int tx_fifo_depth;
|
||||
unsigned int rx_fifo_depth;
|
||||
int rx_outstanding;
|
||||
};
|
||||
|
||||
#define ACCESS_SWAP 0x00000001
|
||||
|
||||
@ -375,6 +375,8 @@ static void ntb_netdev_remove(struct pci_dev *pdev)
|
||||
if (dev == NULL)
|
||||
return;
|
||||
|
||||
list_del(&dev->list);
|
||||
|
||||
ndev = dev->ndev;
|
||||
|
||||
unregister_netdev(ndev);
|
||||
|
||||
@ -345,7 +345,7 @@ int ntb_read_remote_spad(struct ntb_device *ndev, unsigned int idx, u32 *val)
|
||||
*/
|
||||
void __iomem *ntb_get_mw_vbase(struct ntb_device *ndev, unsigned int mw)
|
||||
{
|
||||
if (mw > NTB_NUM_MW)
|
||||
if (mw >= NTB_NUM_MW)
|
||||
return NULL;
|
||||
|
||||
return ndev->mw[mw].vbase;
|
||||
@ -362,7 +362,7 @@ void __iomem *ntb_get_mw_vbase(struct ntb_device *ndev, unsigned int mw)
|
||||
*/
|
||||
resource_size_t ntb_get_mw_size(struct ntb_device *ndev, unsigned int mw)
|
||||
{
|
||||
if (mw > NTB_NUM_MW)
|
||||
if (mw >= NTB_NUM_MW)
|
||||
return 0;
|
||||
|
||||
return ndev->mw[mw].bar_sz;
|
||||
@ -380,7 +380,7 @@ resource_size_t ntb_get_mw_size(struct ntb_device *ndev, unsigned int mw)
|
||||
*/
|
||||
void ntb_set_mw_addr(struct ntb_device *ndev, unsigned int mw, u64 addr)
|
||||
{
|
||||
if (mw > NTB_NUM_MW)
|
||||
if (mw >= NTB_NUM_MW)
|
||||
return;
|
||||
|
||||
dev_dbg(&ndev->pdev->dev, "Writing addr %Lx to BAR %d\n", addr,
|
||||
@ -1027,8 +1027,8 @@ static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
ndev->mw[i].vbase =
|
||||
ioremap_wc(pci_resource_start(pdev, MW_TO_BAR(i)),
|
||||
ndev->mw[i].bar_sz);
|
||||
dev_info(&pdev->dev, "MW %d size %d\n", i,
|
||||
(u32) pci_resource_len(pdev, MW_TO_BAR(i)));
|
||||
dev_info(&pdev->dev, "MW %d size %llu\n", i,
|
||||
pci_resource_len(pdev, MW_TO_BAR(i)));
|
||||
if (!ndev->mw[i].vbase) {
|
||||
dev_warn(&pdev->dev, "Cannot remap BAR %d\n",
|
||||
MW_TO_BAR(i));
|
||||
|
||||
@ -58,7 +58,7 @@
|
||||
#include <linux/ntb.h>
|
||||
#include "ntb_hw.h"
|
||||
|
||||
#define NTB_TRANSPORT_VERSION 2
|
||||
#define NTB_TRANSPORT_VERSION 3
|
||||
|
||||
static unsigned int transport_mtu = 0x401E;
|
||||
module_param(transport_mtu, uint, 0644);
|
||||
@ -173,10 +173,13 @@ struct ntb_payload_header {
|
||||
|
||||
enum {
|
||||
VERSION = 0,
|
||||
MW0_SZ,
|
||||
MW1_SZ,
|
||||
NUM_QPS,
|
||||
QP_LINKS,
|
||||
NUM_QPS,
|
||||
NUM_MWS,
|
||||
MW0_SZ_HIGH,
|
||||
MW0_SZ_LOW,
|
||||
MW1_SZ_HIGH,
|
||||
MW1_SZ_LOW,
|
||||
MAX_SPAD,
|
||||
};
|
||||
|
||||
@ -297,7 +300,7 @@ int ntb_register_client_dev(char *device_name)
|
||||
{
|
||||
struct ntb_transport_client_dev *client_dev;
|
||||
struct ntb_transport *nt;
|
||||
int rc;
|
||||
int rc, i = 0;
|
||||
|
||||
if (list_empty(&ntb_transport_list))
|
||||
return -ENODEV;
|
||||
@ -315,7 +318,7 @@ int ntb_register_client_dev(char *device_name)
|
||||
dev = &client_dev->dev;
|
||||
|
||||
/* setup and register client devices */
|
||||
dev_set_name(dev, "%s", device_name);
|
||||
dev_set_name(dev, "%s%d", device_name, i);
|
||||
dev->bus = &ntb_bus_type;
|
||||
dev->release = ntb_client_release;
|
||||
dev->parent = &ntb_query_pdev(nt->ndev)->dev;
|
||||
@ -327,6 +330,7 @@ int ntb_register_client_dev(char *device_name)
|
||||
}
|
||||
|
||||
list_add_tail(&client_dev->entry, &nt->client_devs);
|
||||
i++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -486,12 +490,13 @@ static void ntb_transport_setup_qp_mw(struct ntb_transport *nt,
|
||||
(qp_num / NTB_NUM_MW * rx_size);
|
||||
rx_size -= sizeof(struct ntb_rx_info);
|
||||
|
||||
qp->rx_buff = qp->remote_rx_info + sizeof(struct ntb_rx_info);
|
||||
qp->rx_max_frame = min(transport_mtu, rx_size);
|
||||
qp->rx_buff = qp->remote_rx_info + 1;
|
||||
/* Due to housekeeping, there must be atleast 2 buffs */
|
||||
qp->rx_max_frame = min(transport_mtu, rx_size / 2);
|
||||
qp->rx_max_entry = rx_size / qp->rx_max_frame;
|
||||
qp->rx_index = 0;
|
||||
|
||||
qp->remote_rx_info->entry = qp->rx_max_entry;
|
||||
qp->remote_rx_info->entry = qp->rx_max_entry - 1;
|
||||
|
||||
/* setup the hdr offsets with 0's */
|
||||
for (i = 0; i < qp->rx_max_entry; i++) {
|
||||
@ -502,6 +507,19 @@ static void ntb_transport_setup_qp_mw(struct ntb_transport *nt,
|
||||
|
||||
qp->rx_pkts = 0;
|
||||
qp->tx_pkts = 0;
|
||||
qp->tx_index = 0;
|
||||
}
|
||||
|
||||
static void ntb_free_mw(struct ntb_transport *nt, int num_mw)
|
||||
{
|
||||
struct ntb_transport_mw *mw = &nt->mw[num_mw];
|
||||
struct pci_dev *pdev = ntb_query_pdev(nt->ndev);
|
||||
|
||||
if (!mw->virt_addr)
|
||||
return;
|
||||
|
||||
dma_free_coherent(&pdev->dev, mw->size, mw->virt_addr, mw->dma_addr);
|
||||
mw->virt_addr = NULL;
|
||||
}
|
||||
|
||||
static int ntb_set_mw(struct ntb_transport *nt, int num_mw, unsigned int size)
|
||||
@ -509,12 +527,20 @@ static int ntb_set_mw(struct ntb_transport *nt, int num_mw, unsigned int size)
|
||||
struct ntb_transport_mw *mw = &nt->mw[num_mw];
|
||||
struct pci_dev *pdev = ntb_query_pdev(nt->ndev);
|
||||
|
||||
/* No need to re-setup */
|
||||
if (mw->size == ALIGN(size, 4096))
|
||||
return 0;
|
||||
|
||||
if (mw->size != 0)
|
||||
ntb_free_mw(nt, num_mw);
|
||||
|
||||
/* Alloc memory for receiving data. Must be 4k aligned */
|
||||
mw->size = ALIGN(size, 4096);
|
||||
|
||||
mw->virt_addr = dma_alloc_coherent(&pdev->dev, mw->size, &mw->dma_addr,
|
||||
GFP_KERNEL);
|
||||
if (!mw->virt_addr) {
|
||||
mw->size = 0;
|
||||
dev_err(&pdev->dev, "Unable to allocate MW buffer of size %d\n",
|
||||
(int) mw->size);
|
||||
return -ENOMEM;
|
||||
@ -604,25 +630,31 @@ static void ntb_transport_link_work(struct work_struct *work)
|
||||
u32 val;
|
||||
int rc, i;
|
||||
|
||||
/* send the local info */
|
||||
rc = ntb_write_remote_spad(ndev, VERSION, NTB_TRANSPORT_VERSION);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Error writing %x to remote spad %d\n",
|
||||
0, VERSION);
|
||||
goto out;
|
||||
/* send the local info, in the opposite order of the way we read it */
|
||||
for (i = 0; i < NTB_NUM_MW; i++) {
|
||||
rc = ntb_write_remote_spad(ndev, MW0_SZ_HIGH + (i * 2),
|
||||
ntb_get_mw_size(ndev, i) >> 32);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Error writing %u to remote spad %d\n",
|
||||
(u32)(ntb_get_mw_size(ndev, i) >> 32),
|
||||
MW0_SZ_HIGH + (i * 2));
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = ntb_write_remote_spad(ndev, MW0_SZ_LOW + (i * 2),
|
||||
(u32) ntb_get_mw_size(ndev, i));
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Error writing %u to remote spad %d\n",
|
||||
(u32) ntb_get_mw_size(ndev, i),
|
||||
MW0_SZ_LOW + (i * 2));
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
rc = ntb_write_remote_spad(ndev, MW0_SZ, ntb_get_mw_size(ndev, 0));
|
||||
rc = ntb_write_remote_spad(ndev, NUM_MWS, NTB_NUM_MW);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Error writing %x to remote spad %d\n",
|
||||
(u32) ntb_get_mw_size(ndev, 0), MW0_SZ);
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = ntb_write_remote_spad(ndev, MW1_SZ, ntb_get_mw_size(ndev, 1));
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Error writing %x to remote spad %d\n",
|
||||
(u32) ntb_get_mw_size(ndev, 1), MW1_SZ);
|
||||
NTB_NUM_MW, NUM_MWS);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -633,16 +665,10 @@ static void ntb_transport_link_work(struct work_struct *work)
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = ntb_read_local_spad(nt->ndev, QP_LINKS, &val);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Error reading spad %d\n", QP_LINKS);
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = ntb_write_remote_spad(ndev, QP_LINKS, val);
|
||||
rc = ntb_write_remote_spad(ndev, VERSION, NTB_TRANSPORT_VERSION);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Error writing %x to remote spad %d\n",
|
||||
val, QP_LINKS);
|
||||
NTB_TRANSPORT_VERSION, VERSION);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -667,34 +693,44 @@ static void ntb_transport_link_work(struct work_struct *work)
|
||||
goto out;
|
||||
dev_dbg(&pdev->dev, "Remote max number of qps = %d\n", val);
|
||||
|
||||
rc = ntb_read_remote_spad(ndev, MW0_SZ, &val);
|
||||
rc = ntb_read_remote_spad(ndev, NUM_MWS, &val);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Error reading remote spad %d\n", MW0_SZ);
|
||||
dev_err(&pdev->dev, "Error reading remote spad %d\n", NUM_MWS);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!val)
|
||||
if (val != NTB_NUM_MW)
|
||||
goto out;
|
||||
dev_dbg(&pdev->dev, "Remote MW0 size = %d\n", val);
|
||||
dev_dbg(&pdev->dev, "Remote number of mws = %d\n", val);
|
||||
|
||||
rc = ntb_set_mw(nt, 0, val);
|
||||
if (rc)
|
||||
goto out;
|
||||
for (i = 0; i < NTB_NUM_MW; i++) {
|
||||
u64 val64;
|
||||
|
||||
rc = ntb_read_remote_spad(ndev, MW1_SZ, &val);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Error reading remote spad %d\n", MW1_SZ);
|
||||
goto out;
|
||||
rc = ntb_read_remote_spad(ndev, MW0_SZ_HIGH + (i * 2), &val);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Error reading remote spad %d\n",
|
||||
MW0_SZ_HIGH + (i * 2));
|
||||
goto out1;
|
||||
}
|
||||
|
||||
val64 = (u64) val << 32;
|
||||
|
||||
rc = ntb_read_remote_spad(ndev, MW0_SZ_LOW + (i * 2), &val);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Error reading remote spad %d\n",
|
||||
MW0_SZ_LOW + (i * 2));
|
||||
goto out1;
|
||||
}
|
||||
|
||||
val64 |= val;
|
||||
|
||||
dev_dbg(&pdev->dev, "Remote MW%d size = %llu\n", i, val64);
|
||||
|
||||
rc = ntb_set_mw(nt, i, val64);
|
||||
if (rc)
|
||||
goto out1;
|
||||
}
|
||||
|
||||
if (!val)
|
||||
goto out;
|
||||
dev_dbg(&pdev->dev, "Remote MW1 size = %d\n", val);
|
||||
|
||||
rc = ntb_set_mw(nt, 1, val);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
nt->transport_link = NTB_LINK_UP;
|
||||
|
||||
for (i = 0; i < nt->max_qps; i++) {
|
||||
@ -708,6 +744,9 @@ static void ntb_transport_link_work(struct work_struct *work)
|
||||
|
||||
return;
|
||||
|
||||
out1:
|
||||
for (i = 0; i < NTB_NUM_MW; i++)
|
||||
ntb_free_mw(nt, i);
|
||||
out:
|
||||
if (ntb_hw_link_status(ndev))
|
||||
schedule_delayed_work(&nt->link_work,
|
||||
@ -780,10 +819,10 @@ static void ntb_transport_init_queue(struct ntb_transport *nt,
|
||||
(qp_num / NTB_NUM_MW * tx_size);
|
||||
tx_size -= sizeof(struct ntb_rx_info);
|
||||
|
||||
qp->tx_mw = qp->rx_info + sizeof(struct ntb_rx_info);
|
||||
qp->tx_max_frame = min(transport_mtu, tx_size);
|
||||
qp->tx_mw = qp->rx_info + 1;
|
||||
/* Due to housekeeping, there must be atleast 2 buffs */
|
||||
qp->tx_max_frame = min(transport_mtu, tx_size / 2);
|
||||
qp->tx_max_entry = tx_size / qp->tx_max_frame;
|
||||
qp->tx_index = 0;
|
||||
|
||||
if (nt->debugfs_dir) {
|
||||
char debugfs_name[4];
|
||||
@ -897,10 +936,7 @@ void ntb_transport_free(void *transport)
|
||||
pdev = ntb_query_pdev(nt->ndev);
|
||||
|
||||
for (i = 0; i < NTB_NUM_MW; i++)
|
||||
if (nt->mw[i].virt_addr)
|
||||
dma_free_coherent(&pdev->dev, nt->mw[i].size,
|
||||
nt->mw[i].virt_addr,
|
||||
nt->mw[i].dma_addr);
|
||||
ntb_free_mw(nt, i);
|
||||
|
||||
kfree(nt->qps);
|
||||
ntb_unregister_transport(nt->ndev);
|
||||
@ -999,11 +1035,16 @@ out:
|
||||
static void ntb_transport_rx(unsigned long data)
|
||||
{
|
||||
struct ntb_transport_qp *qp = (struct ntb_transport_qp *)data;
|
||||
int rc;
|
||||
int rc, i;
|
||||
|
||||
do {
|
||||
/* Limit the number of packets processed in a single interrupt to
|
||||
* provide fairness to others
|
||||
*/
|
||||
for (i = 0; i < qp->rx_max_entry; i++) {
|
||||
rc = ntb_process_rxc(qp);
|
||||
} while (!rc);
|
||||
if (rc)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void ntb_transport_rxc_db(void *data, int db_num)
|
||||
@ -1210,12 +1251,14 @@ EXPORT_SYMBOL_GPL(ntb_transport_create_queue);
|
||||
*/
|
||||
void ntb_transport_free_queue(struct ntb_transport_qp *qp)
|
||||
{
|
||||
struct pci_dev *pdev = ntb_query_pdev(qp->ndev);
|
||||
struct pci_dev *pdev;
|
||||
struct ntb_queue_entry *entry;
|
||||
|
||||
if (!qp)
|
||||
return;
|
||||
|
||||
pdev = ntb_query_pdev(qp->ndev);
|
||||
|
||||
cancel_delayed_work_sync(&qp->link_work);
|
||||
|
||||
ntb_unregister_db_callback(qp->ndev, qp->qp_num);
|
||||
@ -1371,12 +1414,13 @@ EXPORT_SYMBOL_GPL(ntb_transport_link_up);
|
||||
*/
|
||||
void ntb_transport_link_down(struct ntb_transport_qp *qp)
|
||||
{
|
||||
struct pci_dev *pdev = ntb_query_pdev(qp->ndev);
|
||||
struct pci_dev *pdev;
|
||||
int rc, val;
|
||||
|
||||
if (!qp)
|
||||
return;
|
||||
|
||||
pdev = ntb_query_pdev(qp->ndev);
|
||||
qp->client_ready = NTB_LINK_DOWN;
|
||||
|
||||
rc = ntb_read_local_spad(qp->ndev, QP_LINKS, &val);
|
||||
@ -1408,6 +1452,9 @@ EXPORT_SYMBOL_GPL(ntb_transport_link_down);
|
||||
*/
|
||||
bool ntb_transport_link_query(struct ntb_transport_qp *qp)
|
||||
{
|
||||
if (!qp)
|
||||
return false;
|
||||
|
||||
return qp->qp_link == NTB_LINK_UP;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ntb_transport_link_query);
|
||||
@ -1422,6 +1469,9 @@ EXPORT_SYMBOL_GPL(ntb_transport_link_query);
|
||||
*/
|
||||
unsigned char ntb_transport_qp_num(struct ntb_transport_qp *qp)
|
||||
{
|
||||
if (!qp)
|
||||
return 0;
|
||||
|
||||
return qp->qp_num;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ntb_transport_qp_num);
|
||||
@ -1436,6 +1486,9 @@ EXPORT_SYMBOL_GPL(ntb_transport_qp_num);
|
||||
*/
|
||||
unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp)
|
||||
{
|
||||
if (!qp)
|
||||
return 0;
|
||||
|
||||
return qp->tx_max_frame - sizeof(struct ntb_payload_header);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ntb_transport_max_size);
|
||||
|
||||
@ -1796,7 +1796,11 @@ static noinline int copy_to_sk(struct btrfs_root *root,
|
||||
item_off = btrfs_item_ptr_offset(leaf, i);
|
||||
item_len = btrfs_item_size_nr(leaf, i);
|
||||
|
||||
if (item_len > BTRFS_SEARCH_ARGS_BUFSIZE)
|
||||
btrfs_item_key_to_cpu(leaf, key, i);
|
||||
if (!key_in_sk(key, sk))
|
||||
continue;
|
||||
|
||||
if (sizeof(sh) + item_len > BTRFS_SEARCH_ARGS_BUFSIZE)
|
||||
item_len = 0;
|
||||
|
||||
if (sizeof(sh) + item_len + *sk_offset >
|
||||
@ -1805,10 +1809,6 @@ static noinline int copy_to_sk(struct btrfs_root *root,
|
||||
goto overflow;
|
||||
}
|
||||
|
||||
btrfs_item_key_to_cpu(leaf, key, i);
|
||||
if (!key_in_sk(key, sk))
|
||||
continue;
|
||||
|
||||
sh.objectid = key->objectid;
|
||||
sh.offset = key->offset;
|
||||
sh.type = key->type;
|
||||
|
||||
@ -39,7 +39,7 @@
|
||||
#define VIRTIO_CONSOLE_F_SIZE 0 /* Does host provide console size? */
|
||||
#define VIRTIO_CONSOLE_F_MULTIPORT 1 /* Does host provide multiple ports? */
|
||||
|
||||
#define VIRTIO_CONSOLE_BAD_ID (~(u32)0)
|
||||
#define VIRTIO_CONSOLE_BAD_ID (~(__u32)0)
|
||||
|
||||
struct virtio_console_config {
|
||||
/* colums of the screens */
|
||||
|
||||
Reference in New Issue
Block a user